[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выделение слов тексте с учетом...
Kumena
Здравствуйте, Уважаемые!

Прошу помочь с решением:

Мне нужно в имеющемся тексте ($text) визуально выделить некоторые слова ($word). Причем необходимо точно учитывать то, чтобы слово было цельным, а не частью другого слова. Т.е.:
str_replace($word,"<span class=\"highlighted\">$word</span>",$text);
не подходит, т.к. выделит необыЧАЙный вместо слова "чай".

Я использую:
str_replace(" $word "," <span class=\"highlighted\">$word</span> ",$text);
т.е. добавляю пробелы по краям слова.

НО: слово может находится в тексте в начале или в конце строки ( \n или \r\n ? ) и такое слово моим скриптом не выделится.

Прошу поделиться красивым, может быть даже более полным, решением для таких случаев. Готов при необходимости осыпать благодетеля золотом в символическом размере ;)
dron4ik
$word = ' чай ';
А так?

если $wordберем с ПОСТа или ГЕТа то
$word = ' ' . $_POST['word'] . ' ';
Хотя я не подумал и про точку или запятую...

_____________
Ex3m.com.ua — Активный образ жизни
Kumena
Цитата (dron4ik @ 26.02.2013 - 10:27)
$word = ' чай ';

Это именно то, что я делаю сейчас в
str_replace(" $word ",...

Точно! Именно точки, запятые, и переносы строк мне и нужно учесть. Возможно, что-то еще. Делать
str_replace(" $word ".",",...
для каждого возможного случая кажется некрасивым решением.
Shkiper
Kumena как вариант .....
$text = explode(" ", $_POST['text']);
foreach($text as $k=>$v)
{
$text[$k] = str_replace($word,"<span class=\"highlighted\">$word</span>",$v);
}

$text = implode(" ", $text);

Но боюсь этот вариант Эксперты не одобрят, т.к. находят постоянно вариант лучше моего(код не тестил писал "от руки") :)
Placido
preg_replace('/\b(' . $word . ')\b/',"<span class=\"highlighted\">\1</span>",$text);
Shkiper
Я же говорил smile.gif
Kumena
Shkiper, Ваш вариант, похоже, как и мой, учитывает только пробелы по концам слов. smile.gif

Вариант Placido кажется очень интересным, но я не секу в регулярных выражениях. Он учитывает точки, запятые и переносы строк по краям слова?
killer8080
Цитата (Kumena @ 26.02.2013 - 13:43)
Он учитывает точки, запятые и переносы строк по краям слова?

учитывает, но с кириллицей могут быть проблемы.
Shkiper
А вот так:
<style>
.
highlighted
{
background: yellow;
color: red;
}
</style>
<?php

$text = "я пью максичай, так же и черный чай";
$word = "чай";
$text = explode(" ", $text);
foreach($text as $k=>$v)
{
if($v == $word)
{
$text[$k] = "<span class=\"highlighted\">$word</span>";
}
}


$text = implode(" ", $text);

echo $text;
Kumena
Shkiper, угу-угу, но т.к. Вы делаете explode(" ", $text);, то в качестве каждого элемента массивы вы получите в том числе и "чай," и "чай." и "пью\nчай" (с переносом строки, но без пробела) которые не равны "чай" и скрипт их пропустит.
Вариант с регулярками от Placido полез проверять, скоро вернусь! smile.gif
killer8080
Цитата (Kumena @ 26.02.2013 - 14:27)
Вариант с регулярками от Placido полез проверять, скоро вернусь!

Только проверяй на той версии php, на какой он по факту будет работать. smile.gif
Kumena
Простите, что долго молчал, навалились другие дела)

Вариант с preg_replace от Placido я опробовал, очень понравился!

Действительно отлично выделяются слова в начале и в конце строк, перед точками, запятыми итд! Здорово!

Ввиду специфики моей задачи (собственно, я выделяю красным цветом слова от spell-checker-а) мне нужно будет еще отсеять доменные имена в тексте. Сейчас, например в "phpforum.ru" часть "phpforum" - красная. Но это мне нужно исправлять не на этапе выделения цветом, а у самого spell-checker-а.

Большущее спасибо отозвавшимся за помощь!
killer8080
Цитата (Kumena @ 2.03.2013 - 13:12)
Сейчас, например в "phpforum.ru" часть "phpforum" - красная.

В pcre для этого есть assertions
Куку
$tmp=explode($search,$string);
$string=implode('<strong>'.$search.'</strong>',$tmp);
print $string;
Быстрый ответ:

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