Регулярка на сервере работает неадекватно

kalamfur

Новичок
Регулярка на сервере работает неадекватно

Задача такая. Есть массив слов (слово1, слово2...)
Надо из текста

текст текст текст текст текст текст текст текст текст текст текст текст
текст текст текст текст наше слово1 текст текст текст текст текст текст текст
текст текст текст текст текст текст текст текст текст текст текст текст
текст текст текст
текст текст текст текст текст текст "слово2ое " текст текст текст текст текст текст
текст текст текст текст текст текст текст текст текст текст текст
текст текст еще слово2а текст текст текст текст текст текст текст текст
текст текст текст текст текст текст текст текст текст текст текст
================================================
выбрать выделенное.
наше слово1
слово2ое
еще слово2а

================================================

Делаю так:
PHP:
$wc=array("слово1", "слово2");
foreach ($wc as $w1) {
$patterns = '/(^|\s|\W|\'|\")((\w{3,}\s+)?'.$w1.'\w*+)(\s|\W|\'|\")/is';
$replaser = "\$1<b>\$2</b>\$4";
$f = preg_replace($patterns, $replaser , $f);
}
echo $f;
На WAMP'е работает "на ура".
На хосте - нет.

Пример работы скрипта - kalamfur.ru
 

freeek

Новичок
Re: Регулярка на сервере работает неадекватно

да, как то неадекватно работает

//=======================================
Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, [email protected] and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request.
Apache/2 Server at kalamfur.ru Port 80
 

kalamfur

Новичок
Re: Re: Регулярка на сервере работает неадекватно

Автор оригинала: freeek
Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.
Ага, и сервер малость глючит.. Попробуйте обновить страницу - хостер пока ничего толком по этому поводу не сказал.
 

freeek

Новичок
логикак регулярки в том что ищем, словосочетание

1) начинающееся с несловарного символа (набор альтернатив, в нашем случае)
2) любого слова длинной не менее 3х символов, отделенное от (3) мин 1м пробелом, которого впрочем может и не быть
3) тскомое слово отделенное, которое может являтся корнем некого слова, при том что таких слов должно быть мин 1 штука, (если честно, немного не допонял вариант: \w*+)
4) заканчивающегося на несловарный символ (набор альтернатив, в нашем случае)


мне кажется, проблема где то в (3), особенно вот это вот \w*+ не совсем понятно, т.е. получается, что то типа: слово1\w*+

если б был внятный пример, можно б было подумать в чем проблема

-~{}~ 08.11.09 14:40:

ну на локалке вроде срабатывает как ожидается
 

kalamfur

Новичок
Т.е. у нас есть любой текст
и
есть массив слов, которые нам в тексте надо выделить.
При чем выделяем мы не просто слова, а словосочетания, в которых слово может быть даже в другой словоформе (другой падеж, число).

словосочетанием не будет предлог+ слово, отсюда и ограничение на 3 символа.

\w*+ можно заменить на \w* - результат тот же..
\w* играет роль окончания
например слово "шкаф" будет выделенно в тексте, даже если "много ШКАФов" или "Волосатые назойливые ШКАФы".
 

freeek

Новичок
проще говоря, мы ищем слово в тексте которому предшествует любое другое слово, не предлог?
 

kalamfur

Новичок
..на локалке пашет как часы..

-~{}~ 08.11.09 16:50:

нет, мы ищем слово из массива, которому предшествует(или нет) не предлог, возможно оно в ковычках и в другой словоформе.
 

freeek

Новичок
Автор оригинала: kalamfur
нет, мы ищем слово из массива, которому предшествует(или нет) не предлог, возможно оно в ковычках и в другой словоформе.
собственно я об этом и говорил, но вот по вопросу кавычек, если имелось ввиду что менно искомое слово в кавычках может быть, я представляю это так:

PHP:
 <?php

  $f = 'реформ слово2
— текст текст текст текст текст текст текст текст текст текст текст текст
текст текст текст текст наше слово1 текст текст текст текст текст текст текст
текст текст текст текст текст текст текст текст текст текст текст текст 
текст текст текст реформы слово2
текст текст текст текст текст текст1 "слово2ое" текст текст текст текст текст текст 
текст текст передачи данных текст текст текст текст текст текст текст текст текст 
текст текст еще слово2а текст текст текст реформ fdhi слово2 текст текстпередачей данных текст текст текст 
текст текст текст текст текст текст текст текст текст текст текст передачей данных 
данная утилита дает возможность чтения дисков защищенных от копирования.';

  $wc = array( "слово1", "слово2", "данных" );
  foreach ( $wc as $w1 )
  {
    $patterns = '%((?:\w{3,}\s+)?\W?' . $w1 . '(?:\w*)\W?)%is';
    $replaser = "<b>!->$1<-!</b>";
    $f = preg_replace( $patterns, $replaser, $f );
  }
  echo $f;

?>
по поводу, того почему не работает на сервере, возможно проблема в кодировке?

-~{}~ 08.11.09 15:10:

замени \w на нужный символьный класс, все будет работать

PHP:
$patterns = '%((?:[а-яa-z]{3,}\s+)?\W?' . $w1 . '(?:[а-яa-z]*)\W?)%is';
 

kalamfur

Новичок
Автор оригинала: freeek


замени \w на нужный символьный класс, все будет работать

PHP:
$patterns = '%((?:[а-яa-z]{3,}\s+)?\W?' . $w1 . '(?:[а-яa-z]*)\W?)%is';
freeek, спасибо, брат, выручил.
заменил [а-яa-z] и заработало.
 
Сверху