Как можно удалить символ из середины и конца слова, но не удалять его в начале слова?

Как удалить последовательности восклицательных знаков из середины слов в строке, используя функцию preg_replace в PHP? Удаление в конце слов происходит корректно, но требуется убрать лишние восклицательные знаки из середины слов. Как можно модифицировать регулярное выражение, чтобы добиться нужной функциональности?
  • 4 января 2024 г. 8:58
Ответы на вопрос 2
Для удаления символа (например, восклицательного знака '!') из середины и конца слова, но не из начала слова, вы можете использовать регулярное выражение с отрицательным предваряющим утверждением (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, проверяющий, что после восклицательных знаков следует буква или цифра (часть слова).

Это регулярное выражение исключит удаление восклицательных знаков в начале слов и если восклицательный знак стоит в конце слова или сам по себе между слов.
слово состоит из букв и тире т.е. подойдет что-то вроде ([-\w]+)(!+)([-\w]+)
Похожие вопросы