Следующая функция разбивает некоторые слова на массив, настраивает пробелы и делает что-то еще, что мне нужно. Мне также нужно удалить тире, поскольку я пишу их также как слова. Но эта функция не удаляет тире. Что не так?
function stripwords($string) { // build pattern once static $pattern = null; if ($pattern === null) { // pull words to remove from somewhere $words = array('alpha', 'beta', '-'); // escape special characters foreach ($words as &$word) { $word = preg_quote($word, '#'); } // combine to regex $pattern = '#\b(' . join('|', $words) . ')\b\s*#iS'; } $print = preg_replace($pattern, '', $string); list($firstpart)=explode('+', $print); return $firstpart; }
Чтобы ответить на ваш вопрос, проблема заключается в \b
который обозначает границу слова. Если у вас есть пробел до или после дефиса, он не будет удалять его, как в «-», граница слова не применяется.
С http://www.regular-expressions.info/wordboundaries.html :
Существуют три разных позиции, которые квалифицируются как границы слов:
- Перед первым символом в строке, если первый символ является символом слова.
- После последнего символа в строке, если последний символ является символом слова.
- Между двумя символами в строке, где один является символом слова, а другой не является символом слова.
«Слово-символ» – это символ, который может использоваться для формирования слов.
Простое решение:
Добавив \s
вместе с \b
к вашему шаблону и используя положительный внешний вид и положительный внешний вид, вы должны решить свою проблему.
$pattern = '#(?<=\b|\s|\A)(' . join('|', $words) . ')(?=\b|\s|\Z)\s*#iS';
Нигде в вашем шаблоне регулярного выражения вы не видите тире. Почему бы просто не сделать
$string = str_replace('-', '', $string);
после того, как вы сделаете свой regex материал?