Невозможно удалить тире (-) из строки - PullRequest
0 голосов
/ 05 июля 2011

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

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;

}

Ответы [ 2 ]

1 голос
/ 05 июля 2011

Чтобы ответить на ваш вопрос, проблема заключается в \b, который обозначает границу слова. Если у вас есть пробел до или после дефиса, он не будет удален, как в «-», граница слова не применяется.

С http://www.regular -expressions.info / wordboundaries.html :

Есть три разные позиции которые квалифицируются как границы слов:

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

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

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

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

$pattern = '#(?<=\b|\s|\A)(' . join('|', $words) . ')(?=\b|\s|\Z)\s*#iS'; 
0 голосов
/ 05 июля 2011

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

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

после того, как вы делаете свои регулярные выражения?

...