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

ACherry

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

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

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

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

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

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

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

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

after

Guest
Первое, что приходит на ум — создать нечто с использованием 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
 

ACherry

Guest
SashOk
А, запросто :) Это прайслисты, часто обновляемые, и естественно проще загнать одним махом его целиком, нежели прописывать в базу каждую позицию, это столько времени займет :-( Понятно что в последнем случае организовать выборочный вывод было бы делом элементарным.

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

lucas

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

ACherry

Guest
один раз пропарсить при добавлении и записать в таблицу БД в удобоваримом виде
Разносортные они уж больно, приводить к одному виду - опять проблема, на все время нужно.

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

Зачем здесь регистронезависимый поиск?
Ну, что бы выводить и "Такое" и "ТАКОЕ" слово :)
 

SashOk

Guest
А, запросто :) Это прайслисты, часто обновляемые, и естественно проще загнать одним махом его целиком, нежели прописывать в базу каждую позицию, это столько времени займет :-( Понятно что в последнем случае организовать выборочный вывод было бы делом элементарным.
прописывать в базу каждую позицию:
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
 

Falc

Новичок
SashOk
>>Быстрее использовать str_replace
Быстрее рег подправить и не надо никакого str_replace().
 

ACherry

Guest
SashOk
Сложно :) я же только осваиваю...
Спасибо за идею, буду пробовать.

Так и не нашел куда "Параметр 'i' вставить". Буду читать внимательней...
 

ACherry

Guest
Спасибо! Буду теперь доводить до ума это все :)
 
Сверху