фильтрация выводимого содержимого

  • Автор темы Автор темы ACherry
  • Дата начала Дата начала

ACherry

Guest
фильтрация выводимого содержимого

Если есть подобная тема, пожалуйста сильно не бейте :-) , я честно искал (не только на этом форуме причем) к тому же только начинаю осваивать премудрости PHP.

И так: есть некая переменная, скажем $text
В ней находится обычная таблица в html (это небольшой прайс). Стандартная такая таблица <tr><td> текст </td> .... </tr>

(Понимаю, что это не совсем правильный подход к хранению подобных данных, но в этом случае есть ряд причин)

есть некое поисковое слово скажем $word. Задача: вывести только те строки таблицы, где встречается это слово.

Т.е. нужен вывод только тех частей <tr> ... </tr> между которыми хоть раз встретится $word. Остальное как то зафильтровать.

Пока получилось только подсвечивать найденные слова :-) но это было нетрудно найти в статьях про создание систем поиска.

Пожалуйста, помогите советом каким образом это проще реализовать. Очень желательно с примерами кода, ссылки на докумнтацию, которая может помочь в данном случае тоже приму с благодарностью.
 
Первое, что приходит на ум — создать нечто с использованием preg_replace_callback (сразу оговариваюсь, что наверняка скорость выполнения может быть низкой).

Алгоритм: фрагменты текста <tr>...</tr> заменяются на пустую строку, если в них не найдено слово $word.

PHP:
$word = "искомое слово"
function callback_function($matches) {
	# искомое слово
	global $word;
	# если слово не найдено - удаляем строку
	if (strpos($matches[0],$word) === false) return "";
	# иначе оставляем строку
	return $matches[0];
}
$text = preg_replace_callback("{<tr>(.*?)</tr>}","callback_function", $text);

Доки по PCRE функциям: http://ru3.php.net/manual/en/function.preg-replace-callback.php
 
SashOk
А, запросто :-) Это прайслисты, часто обновляемые, и естественно проще загнать одним махом его целиком, нежели прописывать в базу каждую позицию, это столько времени займет :-( Понятно что в последнем случае организовать выборочный вывод было бы делом элементарным.

after
Твой способ сработал! Спасибо! Пришлось только концы строк убрать, не знаю как правильней сказать, в общем типа:
PHP:
$text = eregi_replace("\n", "", $text);

Еще бы сделать независимым от регистра слова поискового :-) А то пришлось все в строчные переводить...
 
ACherry
проще загнать одним махом его целиком, нежели прописывать в базу каждую позицию
А один раз пропарсить при добавлении и записать в таблицу БД в удобоваримом виде религия не позволяет?
$text = eregi_replace("\n", "", $text);
1. Быстрее использовать PCRE.
2. Зачем здесь регистронезависимый поиск? Для увеличения скорости?
 
один раз пропарсить при добавлении и записать в таблицу БД в удобоваримом виде
Разносортные они уж больно, приводить к одному виду - опять проблема, на все время нужно.

Быстрее использовать PCRE
Это совсем на скорую руку, просто что бы заработало.
Более другого способа с ходу в голову не пришло %)

Зачем здесь регистронезависимый поиск?
Ну, что бы выводить и "Такое" и "ТАКОЕ" слово :-)
 
А, запросто :-) Это прайслисты, часто обновляемые, и естественно проще загнать одним махом его целиком, нежели прописывать в базу каждую позицию, это столько времени займет :-( Понятно что в последнем случае организовать выборочный вывод было бы делом элементарным.
прописывать в базу каждую позицию:
PHP:
$matches = preg_match_all('{<TR[^>]*>\s*<TD[^>]*>(*.?)</TD>\s*<TD[^>]*>(*.?)</TD>\s*</TR>}i',$text);
forEach($matches as $match){
   $name = mysql_escape_string($match[1]);
   $price = mysql_escape_string($match[2]);
   $data .= ", ('$name', '$price')";
}
$data = substr($data,2);
mysql_query("INSERT INTO prices(name,price) VALUES $data");
сложно?

Еще бы сделать независимым от регистра слова поискового
доку по регам ты не читал... Параметр i. Почитай, и найди куда его вставить.
1. Быстрее использовать PCRE.
Быстрее использовать str_replace
 
SashOk
>>Быстрее использовать str_replace
Быстрее рег подправить и не надо никакого str_replace().
 
SashOk
Сложно :-) я же только осваиваю...
Спасибо за идею, буду пробовать.

Так и не нашел куда "Параметр 'i' вставить". Буду читать внимательней...
 
Спасибо! Буду теперь доводить до ума это все :-)
 
Сверху