Не удается удалить тире (-) из строки

Следующая функция разбивает некоторые слова на массив, настраивает пробелы и делает что-то еще, что мне нужно. Мне также нужно удалить тире, поскольку я пишу их также как слова. Но эта функция не удаляет тире. Что не так?

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 :

Существуют три разных позиции, которые квалифицируются как границы слов:

  1. Перед первым символом в строке, если первый символ является символом слова.
  2. После последнего символа в строке, если последний символ является символом слова.
  3. Между двумя символами в строке, где один является символом слова, а другой не является символом слова.

«Слово-символ» – это символ, который может использоваться для формирования слов.

Простое решение:

Добавив \s вместе с \b к вашему шаблону и используя положительный внешний вид и положительный внешний вид, вы должны решить свою проблему.

 $pattern = '#(?<=\b|\s|\A)(' . join('|', $words) . ')(?=\b|\s|\Z)\s*#iS'; 

Нигде в вашем шаблоне регулярного выражения вы не видите тире. Почему бы просто не сделать

 $string = str_replace('-', '', $string); 

после того, как вы сделаете свой regex материал?