удалить слово, когда это только одно слово, а не часть составного слова

У меня есть следующая функция: я хочу, чтобы она удаляла «альфа», когда это только одно слово, а не часть составного слова, такого как «alphadog». Теперь вместо этого я вижу только «собаку», и это нехорошо. Любая помощь?

    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;

}

редактировать: привет, у меня есть другая проблема... я отредактировал выше с новой версией функции: она разделяет слова, корректирует пробелы, а затем делает что-то еще, что мне нужно, но не удаляет тире (или минус). .. что случилось? я что-то пробовал, но безрезультатно... спасибо


person smepie    schedule 03.07.2011    source источник
comment
Ваш код в первоначально опубликованном виде был одним из самых уродливых, которые я видел. Потратьте время, чтобы сделать его читабельным, и у вас будет больше шансов получить ответы.   -  person Brad Mace    schedule 04.07.2011
comment
извините, но это не моя ошибка... или не совсем. Я не знаю, почему, когда я помещаю код в строки, нижний код выходит из коробки...   -  person smepie    schedule 04.07.2011
comment
понятно, достаточно выделить текст и нажать на иконку кодовых скобок...   -  person smepie    schedule 05.07.2011


Ответы (2)


Этот:

$pattern = '#' . join('|', $words) . '#iS';

Должно быть так:

$pattern = '#\b' . join('\b|\b', $words) . '\b#iS';
person evan    schedule 04.07.2011
comment
Вы должны создать новый вопрос для новой проблемы. Избавьтесь от \s* — изначально его не было. Другие люди могут не понять, почему эти ответы существуют для нового вопроса, поскольку новый вопрос включает эти ответы. Люди, как правило, смотрят на новые вопросы без каких-либо ответов, поэтому вы не получите столько людей, помогающих вам, если вы сделаете это. - person evan; 05.07.2011

Используйте этот шаблон регулярного выражения

/\balpha\b/

\b означает «граница слова», это означает, что оно будет соответствовать слову по разделителям (если слово окружено разделителями слов).

Надеюсь это поможет

person Edgar Villegas Alvarado    schedule 03.07.2011
comment
то есть... как ввести в этот пример? если я пишу $words = array('/\balpha\b/', 'beta', 'gamma', 'delta'); альфа не вырезается... - person smepie; 04.07.2011
comment
мне всегда нужен массив, но для некоторых слов мне нужно раздеться, как видно... например, а не от того, что остается только f... - person smepie; 04.07.2011