массивы регулярных выражений

Aknichy

Новичок
массивы регулярных выражений

Цель - вырезать из текста стоп-слова, которые хроняться списком в файле.
Проблема в том, что если составлять массив непостредственно:
$badwords = array ("/от/","/того/","/zz/" );
то работает нормально
а если открывть файл, читать и сгонять в масив
то ошибка : Unknown modifier ' ' ...

когда проверяю состаяние массивов(сравниваю что выводит в случае непосредственного объявления с тем, что получается из файла) - они идеентичны

кусочек кода:

PHP:
$id = fopen("stop_words.inc","r");
$data_text="";
while($data = fread($id,filesize ("stop_words.inc")))    $data_text.=$data;   
   $badwords=split("\n",$data_text);
fclose($id);
//$badwords = array ("/от/","/того/","/zz/"  );
//print_r($badwords); 
$text=" zz Зависит от того сколько стоп - слов ";
$text = preg_replace ($badwords, " ", $text);
print "<br>".$text;
[PHP] 

А ведь очень хочеться читать из текстового файла только слова, а не забивать в виде массива...

PS - то что пример будет выдерать не только целые слова но и совпадения в других словах - это я знаю, мне сейчас важно другое.
 

whirlwind

TDD infected, paranoid
ну а кто мешает читать регулярки из файла, и создать из них массив? Только это должны быть регулярки, а не слова.
 

Aknichy

Новичок
white phoenix :
спасибо!

whirlwind : этот файл имеет свойство иногда меняться. каждый раз кроме слова еще и регулярку писать... да и зачем, если ее можно сгенерить на лету - ониж одинаковые все, слово только разное
 

white phoenix

Новичок
Aknichy
Советую оптимизировать:
PHP:
$text = preg_replace('~(?:от|того|zz)~',' ', $text);
-~{}~ 07.02.06 17:15:

Ну и вдогонку, чтоб не захватывались части слов:
PHP:
$text = preg_replace('~(?:\A|\s)(?:от|того|zz)(?:\s|\Z)~',' ', $text);
 

Aknichy

Новичок
спасибо еще раз - работает великолепно
только хотелось бы еще теперь разобраться, что к чему. с регулярками только начинаю работать.
 

zarus

Хитрожопый макак
PHP:
$id = fopen("stop_words.inc","r");
$data_text="";
while($data = fread($id,filesize ("stop_words.inc"))) $data_text.=$data;
$badwords=split("\n",$data_text);
fclose($id);
....
Дичь, делается 1 функцией
PHP:
// Считываем содержимое файла в массив - 1 строка файла = 1 элемент массива
$badwords = file('stop_words.inc');
for ($i = 0, $max = count($badwords); $i < $max; $i++) {
  // Удаляем из начала и конца строки пробельные символы и символы переноса
  $badwords[$i] = trim($badwords[$i]);
  if (empty($badwords[$i])) {
    // Если в результате - пустая строка, то удаляем строку из массива, чтобы не сломать регулярку
    unset($badwords[$i]);
  } else {
    // Экранируем возможные символы в строке, чтобы не сломать регулярку
    $badwords[$i] = preg_quote($badwords[$i]);
  }
} // можно заменить на array_walk
// Сливаем массив в строку для регулярки
$badstr = implode('|',$badwords);
// (с) White_phoenix (с \Z)
$text = preg_replace('~(?:\A|\s)(?:'.$badstr.')(?:\s|\Z)~',' ', $text);
 

Dzen

Новичок
Автор оригинала: white phoenix
Aknichy

Ну и вдогонку, чтоб не захватывались части слов:
PHP:
$text = preg_replace('~(?:\A|\s)(?:от|того|zz)(?:\s|\Z)~',' ', $text);
а вот интересно , можно сделать чтоб наоброт захватывались?:)
то есть если в $text есть слово корень которого "того" и далее окончание.
то есть прочитали "плохие слова" из текстового файла, и одно из них "того"
а в текстовом файле есть слово "тогоже" и оно тоже вырежится полностью потому как в нем присутствует "того".
 

WP

^_^
PHP:
$text = preg_replace('~(?:\A|\s)\w*(?:от|того|zz)\w*(?:\s|\Z)~',' ', $text);
Про локаль не забудь.
 

Dzen

Новичок
$data_text = str_replace("\r",'',$data_text);

а куда это планировалось вставить? куда не вставляю нигде не работает если слова берутся из файла.
Если задавать в массиве в ручную, то всё ок.:-\

Кстати во всех скриптах и Заруса и остальных , если в строке в которой надо вырезать слова, слова для вырезания стоят друг за другом , то они не вырезаются.
То есть "ОТ" вырежится , "ТОГО" не вырежится.
Реально ли это решить:confused:
 
Сверху