Для удаления символа (например, восклицательного знака '!') из середины и конца слова, но не из начала слова, вы можете использовать регулярное выражение с отрицательным предваряющим утверждением (negative lookbehind). Ниже представлен пример кода на PHP, который удаляет лишние восклицательные знаки из середины и конца слов:
```php
$string = "Wow!! Its!! amazing! Look! at it! Or! these! Yes!! Yes!!!";
// Удаляем восклицательные знаки из середины и конца слов, но не удаляем в начале слова
$pattern = '/(?<!\b)!+/';
$replacement = '';
$result = preg_replace($pattern, $replacement, $string);
echo $result; // Выводит: "Wow Its amazing Look at it Or these Yes Yes"
```
В этом примере `(?<!\b)!+` является регулярным выражением, где:
- `(?<!...)` -- отрицательный lookbehind, который проверяет, чтобы перед текущей позицией не находился заданный шаблон.
- `\b` -- обозначает границу слова, поэтому `\b!` будет соответствовать восклицательному знаку на начале слова.
- `!+` -- означает один или более восклицательных знаков подряд.
Теперь давайте модифицируем регулярное выражение так, чтобы оно удаляло последовательности восклицательных знаков только из середины слов:
```php
// Удаляем последовательности восклицательных знаков из середины слов
// Но не удаляем в начале слов и не удаляем одиночные восклицательные знаки
$pattern = '/(?<=\w)!+(?=\w)/';
$replacement = '';
$result = preg_replace($pattern, $replacement, $string);
echo $result; // Выводит строку с удаленными последовательностями восклицательных знаков из середины слов
```
Здесь:
- `(?<=\w)` -- положительный lookbehind, проверяющий, что перед восклицательными знаками есть буква или цифра (часть слова).
- `(?=\w)` -- положительный lookahead, проверяющий, что после восклицательных знаков следует буква или цифра (часть слова).
Это регулярное выражение исключит удаление восклицательных знаков в начале слов и если восклицательный знак стоит в конце слова или сам по себе между слов.