[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выборка нужных слов из текста
l@pteff
Здравствуйте, возник такой вопрос: есть текст из него нужно выбрать все слова "шаблон" по след.условию:
перед словом должен быть пробел, после слова может быть либо пробел, либо любой небуквенно или нечисловой символ, т.е.
"шаблон," или "шаблон..." должны проходить, а "шаблон111" или "111шаблон" должны отсеиваться, и т. д.
После этого выбранные слова нужно подчеркнуть. Делаю так:

/*выбираем нужные слова и помещаем в массив $matches*/
if (preg_match_all("#[\s]+".preg_quote('Шаблон')."[^\dA-Za-zА-Яа-яёЁ]+#isU", $str, $matches)) {
foreach ($matches as $key=>$value) {
for ($i=0; $i<=sizeof($value); $i++) {


/*выбираем из массива $matches слова и подчеркиваем их*/
if (preg_match_all("#[\w]+#isU", "$value[$i]", $changes)) {
foreach ($changes as $key_changes=>$value_changes) {

$str=preg_replace("#".implode('', $value_changes)."#", "<span style='text-decoration:underline'>".implode('', $value_changes)."</span>", $str);
}
}

}
}
}


Проблема в том что нужные слова правильно выбираются из текта и успешно помещаются в массив $matches,
но при подчеркивании подчеркиваются и слова типа "шаблон111" и такие "111шаблон"
не понимаю почему ведь в массив $matches они не проходят, а выборка для подчеркивания производится оттуда



Спустя 16 минут, 53 секунды (4.08.2012 - 22:43) Placido написал(а):
Не понял, зачем такие пляски с бубном?
$str=preg_replace("# (шаблон)\W#is", '<span style="text-decoration:underline">$1</span>', $str);

Спустя 42 минуты, 13 секунд (4.08.2012 - 23:25) l@pteff написал(а):
так убирает пробел перед словом и символ после слова
т.е. там где было "предыдущее слово шаблон," становится "предыдущее словошаблон"

Спустя 10 минут, 3 секунды (4.08.2012 - 23:36) Placido написал(а):
Ну да, зарапортовался. Можно исправить.
str=preg_replace("# (шаблон)(\W+)#is", ' <span style="text-decoration:underline">$1</span>$2', $str);

Спустя 11 минут, 31 секунда (4.08.2012 - 23:47) l@pteff написал(а):
По аналогии сделал для пробелов

$str=preg_replace("#(\s+)(шаблон)(\W+)#is", '$1<span style="text-decoration:underline">$2</span>$3', $str);

но теперь почему-то подчеркивает через один
шаблон шаблон шаблон шаблон шаблон
и т.д.

Спустя 15 минут, 39 секунд (5.08.2012 - 00:03) l@pteff написал(а):
если делаю так то подчеркнет все
str=preg_replace("#(\s*)(шаблон)(\W+)#is", '$1<span style="text-decoration:underline">$2</span>$3', $str);

но это не совсем то, т.к. перед словом пробел обязателен а такая конструкция выберет и такое "111шаблон"

Спустя 6 минут, 19 секунд (5.08.2012 - 00:09) killer8080 написал(а):
Оно?
$t = 'Шаблон Проблема в том что нужные слова правильно выбираются из текта и успешно помещаются в массив $matches, шаблон
но при подчеркивании подчеркиваются и слова типа "шаблон111" и такие "111шаблон" шаблоны
не понимаю почему ведь в массив $matches они не проходят, а выборка для шаблон подчеркивания производится оттуда'
;

echo preg_replace('#(^|\s)(шаблон)([^\d\pL]+)#iuU', '$1<span style="text-decoration: underline; color: red">$2</span>$3', $t);

Спустя 1 минута, 32 секунды (5.08.2012 - 00:11) killer8080 написал(а):
точнее так
$t = 'Шаблон Проблема в том что нужные слова правильно выбираются из текта и успешно помещаются в массив $matches, шаблон
но при подчеркивании подчеркиваются и слова типа "шаблон111" и такие "111шаблон" шаблоны
не понимаю почему ведь в массив $matches они не проходят, а выборка для шаблон подчеркивания производится оттуда шаблон'
;

echo preg_replace('#(^|\s)(шаблон)([^\d\pL]+|$)#iuU', '$1<span style="text-decoration: underline; color: red">$2</span>$3', $t);

Спустя 18 минут, 9 секунд (5.08.2012 - 00:29) l@pteff написал(а):
Применительно к моему коду работает, но если просто для примера взять такой вариант выбирает через один:

$t = 'Шаблон Шаблон Шаблон Шаблон, Шаблон';

echo preg_replace('#(^|\s)(шаблон)([^\d\pL]+|$)#iuU', '$1<span style="text-decoration: underline; color: red">$2</span>$3', $t);

И ещё вопрос: такая конструкция работает только в юникоде?

Спустя 2 часа, 27 минут, 9 секунд (5.08.2012 - 02:56) killer8080 написал(а):
l@pteff
проблема в том, что с кириллицей нельзя использовать символ границы слова \b. Как обходной вариант - использовать утверждения.
$t = 'Шаблон Проблема в том что нужные слова правильно выбираются из текта и успешно помещаются в массив $matches, 
шаблон но при подчеркивании подчеркиваются и слова типа "шаблон111" и такие "111шаблон" шаблоны
не понимаю почему ведь в массив $matches они не проходят, а выборка для шаблон подчеркивания производится оттуда шаблон, шаблон! шаблон шаблон шаблон'
;

echo preg_replace(
'#(?<!\S)(шаблон)(?![\pL\d])#iuU',
'<span style="text-decoration: underline; color: red; font-weight: bold">$1</span>',
$t
);

Спустя 7 часов, 37 секунд (5.08.2012 - 09:56) l@pteff написал(а):
большое спасибо, всё понял, всё работает!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.