Выделение части строки. Очередной вопрос о регулярных выражениях.

ixti

Новичок
Выделение части строки. Очередной вопрос о регулярных выражениях.

Все видели поисковик Yandex. искомое слово он выделяет в текстах жирным шрифтом.
Бъюсь уже несколько дней понять не могу как это сделать.
Точнее представление имею, а как это на практике осуществить не могу понять.

Т.е., к примеру, пользователь в строке поиска вводит: "слов?"
База данных находит рядов 10 с полями содержащими слова "слово", "слову", "слове" и т.п.
как мне теперь эти слова выделить жирным?

Т.е. если конкретное слово есть - тогда я могу и сам это сделать: $word = "слово"; $text = preg_replace("/".$word."/","<b>".$word."</b>",$text);

А если маска? Как мне тогда выделить слово, не догоняю.
 

ForJest

- свежая кровь
Берёшь все найденные слова и выделяешь.
Поиск осуществляется по словам или словоформам их получают до того как поиск осуществлён.
 

ixti

Новичок
Ага. Идея мне понятна а вот реализации ее я не представляю. Не могли бы поподробнее описать?
 

ForJest

- свежая кровь
Ну как - полчаешь словоформы, пихаешь их в массив, положим назови его $words,
и потом
PHP:
foreach ($words as $word)
{
     $text = preg_replace("/".$word."/","<b>".$word."</b>",$text);
}
 

ixti

Новичок
Это-то я понимаю :))
Смысл в следующем:
Пользователь вводит:
Поиск: мет??лайзер
Я делаю запрос к бд:
PHP:
$sql = "SELECT * FROM `table1` WHERE `field1` LIKE 'мет__лайзер' OR `field2` LIKE 'мет__лайзер' ;";
возвращаются все ряды у которых в столбцах field1 или field2 встречается мет??лайзер (где ? - один любой символ или ничего).
скажем вернулось два ряда: field1 = "крутой металлайзер"
а второй: field2 = "стремненький метолайзер"
теперь на основе запроса пользователя мне нужно выделить слова металлайзер и метолайзер заключив их в
PHP:
<b>text</b>
 

ForJest

- свежая кровь
А. В этом смысле. Ну так же никто уже 20 лет как не ищет.
почитай что ли
http://spectator.ru/technology/php/php_search для общего развития.
мне честно сказать даже в лом думать такие сложности - поиск два раза это не по мне.
Один раз его ищет like, а второй раз его должны искать реги...
 

ixti

Новичок
Ага. Это я читал, спасибо.
Дело в том, что составление таблицы с индексами для поиска мне не требуется. смысл моей таблицы такой:
PHP:
+----+------+------+
| id | name | desc |
+----+------+------+
т.е. челове вводит название организации, и скрипт ищет в полях имя и описание.

-~{}~ 17.06.05 13:12:

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

-~{}~ 17.06.05 14:18:

О! Нашел решение! :))
По крайней мере на первое время потянет. Урезал возможности поиска, зато работает :))
PHP:
function bold_coincidences($row,$query_string){
	$query_string = trim($query_string, "%");
	$query_string = explode("%",$query_string);
	foreach ($query_string as $k => $v) {
		foreach ($row as $kk => $vv) {
			$row[$kk] = preg_replace("/" . $query_string[$k] . "/", "<b>" . $query_string[$k] . "</b>", $row[$kk]);
		}
	}
	return $row;
}
а сам поисковик:
PHP:
function searcher($query){
$sql = "SELECT * FROM `table` WHERE `name` LIKE '{$query}' OR `field1` LIKE '{$query}' OR `field2` LIKE '{$query}' OR `field3` LIKE '{$query}' OR `field4` LIKE '{$query}' OR `field5` LIKE '{$query}' ;";
			$result = mysql_query($sql) or die (mysql_error());
			echo "<div style=\"font-size: xx-small;\">Вы искали: <b>" . $searched_string . "</b>, найдено " . mysql_affected_rows() . " записей в базе данных.</div>";
			
			echo "<div style=\"border: double 3px Black;\">\n";
			$bg_color = 1;
			while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
				echo "<div style=\"background-color: "; if ($bg_color % 2 == 1): echo "Orange"; else: echo "Silver"; endif; echo ";\">";
				$row = bold_coincidences($row,$query);
				echo $row['name'];
				echo "</div>\n";
				$bg_color++;
			}
}
 
Сверху