URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 6349
[ Назад ]

Исходное сообщение
"Помогите с регулярным выражением"

Отправлено metacom , 24-Май-09 03:21 
Народ, научите как выражение написать. Написал скрипт поиска, функцию вывода результатов хочу как в яндексе, чтобы предложения с подсветкой ключевиков выбрасывала.
Вот так: "|([^\.]+система[^\.]+)|i" - работает,
а как сделать чтобы с вариантами работало???, типа как: "|([^\.]+система|управления[^\.]+)|i"


function high_lite($text,$keys){ // $text= string, $key= array('система','управления')
preg_match_all("|([^\.]+система[^\.]+)|i",$text,$out); // разбиваем на предложения
$all_string= array_unique ($out[1]);
$text= implode('.
',$all_string);

$key= '';
foreach($keys as $v) { // Собираем ключи - "система|управления"
    $key .= $v.'|';
}
$key= rtrim ($key, '|');

$text=preg_replace("/($key)/si","<b>\\1</b>",$text); // Подсветка ключевиков
return $text;
}


Содержание

Сообщения в этом обсуждении
"Помогите с регулярным выражением"
Отправлено angra , 24-Май-09 21:21 
С регексом все в порядке:
$ perl -E '$_="asdsa система asddasd управления dfsdf";$k="система|управления";s/($k)/<b>$1<\/b>/g;say'
asdsa <b>система</b> asddasd <b>управления</b> dfsdf
так что разбирайтесь с особенностями пыха

"Помогите с регулярным выражением"
Отправлено metacom , 26-Май-09 00:35 
я наверное не совсем точно привел пример, у меня:
есть выражение "|([^\.]+система[^\.]+)|i" оно ищет в тексте слово "система", и помещает в карман всё предложение (от точки до точки) в котором встретилось это слово.

Проблемма в том что когда я хочу искать с логическим или: "|([^\.]+система|управления[^\.]+)|i" чтобы в карман помещалось предложение в котором содержится слово "система" или слово "управления", вот тут почемуто выражение не срабатывает.


"Помогите с регулярным выражением"
Отправлено angra , 26-Май-09 01:40 
А к чему вы тогда привели тот код? И почему в "/($key)/si" вы круглые скобки поставили, а в "|([^\.]+система|управления[^\.]+)|i" упорно не хотите?

"Помогите с регулярным выражением"
Отправлено angra , 26-Май-09 02:22 
На всякий случай уточню
|([^\.]+система|управления[^\.]+)| ищет ( [^\.]+система ) ИЛИ ( управления[^\.]+ ), то есть от точки до система ИЛИ от управления до точки
|([^\.]+(?:система|управления)[^\.]+)| ищет ([^\.]+(система ИЛИ управления) ^\.]+, то есть от точки до (система ИЛИ управления) и до следующей точки
Иллюстрация
$ perl -E '$_="asdsa система asddasd управления dfsdf";s/([^\.]+система|управления[^\.]+)/<b>$1<\/b>/g;say'
<b>asdsa система</b> asddasd <b>управления dfsdf</b>
$ perl -E '$_="asdsa система asddasd управления dfsdf";s/([^\.]+(?:система|управления)[^\.]+)/<b>$1<\/b>/g;say'
<b>asdsa система asddasd управления dfsdf</b>

"Помогите с регулярным выражением"
Отправлено metacom , 26-Май-09 11:54 
"|([^\.]+(?:система|управления)[^\.]+)|i" - вот оно, СЧАСТЬЕ :)))
да именно это я и хотел, спасибо вам.

З.Ы. код привел в качестве иллюстрации работы функции (огород конечно полный), она сначала выдирает из текста предложения:
preg_match_all("|([^\.]+(?:система|управления)[^\.]+)|i",$text,$out);

а потом делает подсветку слов в найденных предложениях:
$text=preg_replace("/(система|управления)/si","<b>\\1</b>",$text);


З.Ы.Ы. а подскажите пожалуйста, как сделать чтобы точка в конце предложения тоже в карман попадала
"|([^\.]+(?:система|управления)[^\.]+)|i"
- здесь попадает лиш - "Заказать - ПОД ЗАКАЗ Система управления устройством"
а надо чтобы - "Заказать - ПОД ЗАКАЗ Система управления устройством."


"Помогите с регулярным выражением"
Отправлено angra , 28-Май-09 07:39 
>З.Ы.Ы. а подскажите пожалуйста, как сделать чтобы точка в конце предложения тоже
>в карман попадала

Дык, это совсем просто, добавьте ее в регекс:
([^\.]+(?:система|управления)[^\.]+)\.


"Помогите с регулярным выражением"
Отправлено metacom , 26-Май-09 11:55 
я пробовал с круглыми скобками, неработало, я не знал что двоеточие нужно...



"Помогите с регулярным выражением"
Отправлено angra , 28-Май-09 07:37 
Вообще-то это _почти_ одно и то же. Просто () делают ограничение для альтернативы И захват. А (?:) делает только ограничение, БЕЗ захвата. Грамотно использовать именно последний вариант, так как он менее ресурсоемок, но большинство шпарит () без раздумий. То есть вариант с () у вас бы тоже сработал, но я в силу привычки дал вариант с (?:)

"Помогите с регулярным выражением"
Отправлено metacom , 28-Май-09 11:50 
Спасибо Вам большое за разъяснения.

З.Ы.
Тяжело мне регулярные выражения даются, никак моск не могу научить с ними работать.



"Помогите с регулярным выражением"
Отправлено angra , 29-Май-09 08:18 
Очень рекомендую Mastering Regular Expressions от O'Reilly http://oreilly.com/catalog/9781565922570/. Даже трети изложенного там материала будет достаточно, чтобы больше не иметь проблем с регексами. Можно найти в сети в том числе и на русском.

"Помогите с регулярным выражением"
Отправлено metacom , 02-Июн-09 14:42 
почитал, все проще оказалось чем я думал. Моск научился закорючки понимать, спасибо!