Выделение найденных поисковых слов http://doc.blox.ru/searchInBlock_highlight.htm Найти записи, содержащие поисковые слова, это еще не всё – при выводе нужно как-то выделить эти слова. Для этого в дескриптор нужно добавить параметр highlight (см. код) songs.tdd <?php $titles[1] = 'Имя исполнителя'; $titles[2] = 'Название песни'; $types[1] = 'varchar(255)'; $types[2] = 'varchar(255)'; $params['isMultiRec'] = true; $params['search']['highlight'] = true; ?> Единственное, что надо иметь в виду, что после добавления параметра highlight, найденные слова будут автоматически обрамлены кодом <span class='blox-searchword'>...</span>. А это означает, что в таблице стилей нужно задать класс blox-searchword, для найденных слов, например, с такими свойствами: songs.css span.blox-searchword {background:yellow; font-weight:inherit} Теперь в результатах поиска поисковые слова будут выделяться.
Другие способы выделения найденных слов В методе, описанном выше, на шаблон поступают данные уже с дополнительным кодом, выделяющим найденные слова. Но бывают случаи, когда в шаблоне нужно иметь данные в чистом виде без лишних тегов. Или, например, к тексту в обработчике применялась php-функция strip_tags(), которая убирает все теги. В этом случае найденные слова можно выделить отдельно с помощью php-функции preg_replace(). При этом, в качестве аргументов можно взять готовые переменные шаблона, а именно: массив паттернов и массив текстов для замены, соответсвенно, $request['search'] ['patterns'] и $request['search']['replacements'] (см. переменные шаблоны). В следующем примере показано, как с помощью этих массивов вывести данные одного поля с выделенными поисковыми словами: .tpl <?php echo preg_replace($request['search']['patterns'][1], $request['search'] ['replacements'][1], $dat[1]); ?>
Массив паттернов для поиска и массив текстов для замены можно подготовить самому с помощью массива поисковых слов$request['search']['searchWords'] (см. переменные шаблоны). .tpl <?php foreach ($request['search']['searchWords'] as $field => $words) { foreach ($words as $word) {
# В значении поля ищется вхождение поискового слова (без учета регистра) $patterns[$field][] = "/($word)/iu"; # Найденное слово заменяется на само себя с тегами для выделения $replacements[$field][] = '<b>$1</b>'; } } ?>
Поисковая выборка (запрос search) Допустим многозаписный блок представляет собой таблицу, в первом столбце которого записано имя исполнителя, а во втором - название песни (см. дескриптор songs.tdd). Наша задача добавить возможность поиска по блоку как по имени исполнителя, так и по названию песни. songs.tdd <?php $titles[1] = 'Имя исполнителя'; $titles[2] = 'Название песни'; $types[1] = 'varchar(255)'; $types[2] = 'varchar(255)'; $params['isMultiRec'] = true; ?>
Поисковые запросы через форму (методом POST) Самый простой способ формирования поискового запроса – это форма. Каждому полю таблицы, по которому вы хотите производить поиск, должен быть сопоставлен элемент формы input для ввода поисковых слов. В значении атрибута name этих элементов должно быть указано имя массива search с ключом, соответствующим номеру поля (см. шаблон songs.tpl). Номер блока можно передавать как методом GET (в атрибуте action), так и методом POST (с помощьюinput). Второй вариант, пожалуй, эстетичнее. songs.tpl <?php echo " <form action='?page=$page' method='post'> <input type='hidden' name='block' value='$block'> <input type='text' name='search[1]'>Имя исполнителя<br> <input type='text' name='search[2]'>Название песни<br> <input type='submit' value='Искать'> </form> <table>"; foreach ($tab as $dat) echo " <tr> <td>{$dat['edit']}</td> <td>$dat[1]</td> <td>$dat[2]</td>
</tr> "; echo " </table>"; ?> Теперь, когда пользователь вводит поисковые слова, будут показаны только те записи, в которых эти слова присутствуют. Морфологический анализ слов не производится, то есть, ищется именно то сочетание букв, которое ввел пользователь. Поэтому желательно вводить не законченную форму какого слова (с суффиксом и окончанием), а только его фрагмент. В каждое поле поиска можно вводить несколько фрагментов, разделенных пробелом. При этом, производится логическая операция "И", то есть, будут выведены только те записи, в значениях соответствующих полей которых присутствуют все введенные фрагменты. Такой же принцип действует при использовании нескольких полей - вводя поисковые строки в несколько полей, вы сужаете круг поиска (число записей). Если оставить все поля ввода пустыми, то извлекутся все записи блока. Это один способов сброса поискового запроса.
Поисковые запросы через URL (методом GET) Что касается формирования поискового запроса, то сам пользователь не может непосредственно формировать URL – он может только выбрать один из запросов, сформированный системой, то есть, щелкнуть по ссылке. Хотя, с помощью JavaScript можно всегда перенести введенное пользователем слово из поля формы в атрибут hrefссылки
Ниже приведен шаблон, на основе предыдущего примера, где вместо формы для ввода поисковых слов, стоит список исполнителей. На основе массива исполнителей (код не показан) создаются ссылки, с помощью которых можно извлечь все записи, относящиеся к тому или иному исполнителю. songs.tpl <?php $performersNames = ...; foreach ($performersNames as $name) echo "<a href='?page=$page&block=$block&search[1]=$name'>$name</a> | ";
echo "<table>"; foreach ($tab as $dat) echo " <tr> <td>{$dat['edit']}</td> <td>$dat[1]</td> <td>$dat[2]</td> </tr> "; echo "</table>"; ?> Кстати, мы рассмотрели пример простой навигации по блоку. Для более эффективной навигации, поисковые запросы лучше делать к полю типа ENUM или SET. При отправке поискового запроса через URL, поисковый текст желательно закодировать.
Короткая форма записи поискового запроса При поисковых запросах вместо параметра search[] можно применять короткую форму записи: s[]. Это особенно удобно, если вы делаете поисковые запросы с помощью ссылок. Пример <?php echo " <a href='?page=$page&block=$block&s[1]=Иванов&s[2]=Петр'>Петр Иванов</a> "; ?> Рекомендуем применять короткую форму, если вы с помощью поисковых запросов осуществляете навигацию по блоку, тогда вам не придется переписывать инструкции для поисковых роботов, находящихся в файле robots.txt. Есть еще более короткая запись поискового запроса, когда не указывается и ключ, то есть, вместо search[1]= или s[1]=пишется search= или s=. http://www.html.by/archive/index.php/t-29106.html?s=bdb628c346538b41ca8d56bce5add5b9 Есть поиск по сайту, необходимо, чтобы слово которое ищешь выделялось другим цветом Вот сам код поиска, куда что сдесь нужно вставить? Заранее спасибо. <?php if (isset($_POST['submit'])) { if ((strlen($_POST['search'])>3)) { $result_123 = mysql_query ( "SELECT * FROM setting WHERE UPPER(title) LIKE '%".strtoupper($_POST['search'])."%' or UPPER(text) LIKE '%".strtoupper($_POST['search'])."%'",$db); $poisk = mysql_fetch_array($result_123); if ($poisk!=null) { do { echo' <tr><td><p class="s1"><a href="'.$poisk[page].'.php">'.$poisk[title].'</a><br/>'. $poisk[meta_d].'</p></td></tr>'; } while ($poisk = mysql_fetch_array($result_123)); echo'<p class="s1" align="center"><a href="index.php">Вернутся на Главную</a></p>'; } else { echo'<p align="center">К сожалению, поиск по сайту не дал никаких результатов. Попробуйте изменить или сократить Ваш запрос.</p>'; echo'<p class="s1" align="center"><a href="index.php">Вернутся на Главную</a></p><br/>'; }; } else { echo'<p align="center">Строка поиска должна быть не менее 4 символов</p>'; echo'<p class="s1" align="center"><a href="index.php">Вернутся на Главную</a></p><br/>'; } } ?> Սա լավ լուծում է: 'word1 word2 word word3 is_word word31 word32' –ի մեջ 'is_word', 'word3' բառերը գրում է դեղին ֆոնով՝այսինքն 'word1 word2 word word3 is_word word31 word32' <? $str = 'word1 word2 word word3 is_word word31 word32'; //Строка $search = array('is_word', 'word3');//Искомые слова $res = eregi_replace (implode("|",$search), '<span style="background-color:yellow">\\0</span>', $str); echo $res ;
http://www.cyberforum.ru/php/thread30679.html <?php //connect if (!mysql_select_db($db)) die('Проверьте существование указанной базы данных'); echo "<form method='post'>";// echo "<input type='text' size=48 name='search' value='" . (isset($_POST['search'])?$_POST['search']:'') . "'>";// echo "<input type='hidden' name='submit' value='1'><input type='submit' value='Найти!'>";// // if (!empty($_POST['submit'])) {// $search = $_POST['search'];// $search=addslashes($search);//. $words = explode(" ", $search);// $sql = "SELECT * FROM $db_data[table] WHERE";// $i = 0;// foreach($db_data['search'] as $v) {// foreach($words as $v1) {// if ($i != 0)// $sql .= "OR";// $sql .= " $v LIKE '%$v1%' ";// $i++;//увеличиваем счетчик }
} if($result=mysql_query($sql))// { if(mysql_num_rows($result)){// while($r=mysql_fetch_array($result)){// { if (isset($_GET['id'])) $result=mysql_query("SELECT bb,cc FROM * WHERE `id`='".(int)$_GET['id']."'"); } echo "<table>"; { echo "
<br><a href='/iwww/www/index.php?id=$r[id]'>$r[bb]</a></br> "; } echo "</table>"; } ?>
<?php $regime = 0;// Режим поиска (1 - точный поиск, 0 - вхождение) $search = "про";// Что ищем (в примере: $search = "про"; ) $beginText = "Этот компромат не про меня"; // Текст по которому необходимо провести поиск /* Точный поиск. (Найдёт: "...не [B]про[/B] меня", Не найдёт "Этот ком[U]про[/U]мат не..." - ) отдельное слово */ if($regime == 1) { $patterns = "/(\b".$search."\b)+/i"; }// Регулярное выражение /* Отдельное слово и Вхождение в другие слова. (Найдёт: "...не [B]про[/B] меня", Найдёт: "Этот ком[B]про[/B]мат не...") */ else { $patterns = "/(".$search.")+/i"; }// Регулярное выражение $replace = "<b>$1</b>";// На что заменить $endText = PREG_REPLACE($patterns,$replace,$beginText);// Замена echo"<hr />".$endText."<hr />";//Вывести подсвеченный текст ?>
http://webstat.ws/st.php?st=35&gr=1
Формула выделения текста или поиск как в Google. Cтатья опубликована: 15/07/2006 Автор: Байзульдин Просмотров статьи: Статья опубликована в следующих разделах сайта: PHP & MySQL
11:57:54 Тимур 7354
Как правило, каждый автор сайта старается сделать дизайн сайта и его функциональность как можно уникальней. Это касается как коммерческих сайтов так и домашних страничек. Все направлено на то, чтоб привлечь внимание посетителя сайта не только тематикой, но и удобной навигацией в море информации. Количество информации постоянно увеличивается, а желание посетителя тратить свое время и деньги на бесплодные поиски интересующей его информации уменьшаются с каждым неудачным результатом поиска и посещением очередной ненужной ссылки. Наиболее красиво решили эту задачу авторы всемирно известного поисковика "google", где в выводе результатов поиска выделяются искомые ключевые слова. Что служит нескольким целям, с одной стороны показывает пользователю, что данная строка была включена в результат поиска именно потому, что найдено соответствие, а главное посетителю
легче ориентироваться. Не тратя зря времени на анализ вывода, где же то, что я искал и почему выведено то, что мне не нужно. Задача становится особенно актуальной если, например, вам необходимо произвести поиск в таблице, по нескольким столбцам одновременно, ирезультатом поиска будет соответственно все та же таблица. В такой ситуации будет гораздо удобней просматривать уже заранее выделенный текст, а не высматривать его самостоятельно в каждой колонке. Эта статья и описывает то, как написать свою функцию выделения найденного искомого текста. И не просто выделить найденный текст цветом, а заключить его в определенные теги. Т.е. самим решать, что именно с ним делать. Выделить слово или его часть цветом, жирным шрифтом или подчеркнутым и т.д. Это уже зависит от фантазии разработчика. Итак сам код: Воспользуемся выражениями.
мощнейшим
инструментом
поиска
и
замены
- регулярными
Создаем два массива: $search - что ищем и $replace - на что заменяем. $searchquery - ключи поиска, разделенные пробелами. $search = array( "/\\\\/", // -- 1 "/([rn])[s]+/", // -- 2 "/s*(.+)s*/", // -- 3 ); $replace = array( "\", // -- 1 " ", // -- 2 "$1", // -- 3 ); Детальное описание работы с регулярными выражениями в PHP выходит за рамки этой статьи. Поэтому ограничусь описанием самой идеи того, как будет генерироваться регулярное выражение из строки запроса пользователя, в поле поиска. Итак каким целям служит каждый шаблон:
1. Заменяем повторяющиеся backslash'и () на один экранированный (\). Предполагается что magic_quotes=1 в php.ini или к строке запроса была применена функция addslashes($searchquery) если magic_quotes=0. 2. Заменяем повторяющиеся пробелы, символы табуляции и перевода строки одним пробелом. 3. Вырезаем результат двух предыдущих замен, отбрасываем пробелы в начале и конце строки, если они присутствуют конечно. $sorted_regexp=preg_replace($search, $replace, preg_quote($searchquery)); В общем уже можно было бы и использовать полученный результат заменяя повторяющиеся пробельные символы не одним пробелом " ", а "|" тем самым получив готовое регулярное выражения сформированное из ключей поиска. Если бы не факты незаметные на первый взгляд. А именно: никто не мешает пользователю ввести несколько идентичных ключей поиска, и зачем их "таскать" за собой или запрещать вводить? Но это не главное, главное то, что сгенерированное регулярное выражение и соответственно выделение текста, работать-то будет, но не так как ожидается. Дело в том, что при таком методе генерации регулярного выражения (шаблона для поиска и выделения) есть существенный недостаток состоящий в том, что поиск и выделение по такому шаблону зависит от того в каком порядке расположены и какой длины ключевые слова поиска.
Например, если посетителю или администратору сайта захочется произвести поиск по email'ам то при вводе запроса в следующей последовательности "@ @list.ru" (предположим, что искомые ключи находятся в таблице), то будут выделены все символы @, но при этом не выделится list.ru. Так как одиночный символ @ стоит первым то и в регулярном выражении он также окажется первым и при обработке текста удовлетворит условию поиска до "@list.ru". Устраним описанный выше недостаток предприняв, затем, следующие действия: 1. 2.
Удалим дублирующиеся ключи поиска (если они есть). Отсортируем ключи поиска в порядке убывания - что и исправит недочет.
В дальнейшем понадобится отсортировать значения массива по их длине в порядке убывания. Следующая функция поможет в этом: <? // === Сортировка значений массива по длине в порядке убывания. // === используется совместно с usort function sort_by_length ($cur_val, $next_val) { $cur=strlen($cur_val); $next=strlen($next_val); if ($cur==$next) return 0; return ($cur<$next)?-1:1; } // === Массив в который занесем ключи поиска - для дальнейшей сортировки $sorted_regexp_array=array(); //Переменная $sorted_regexp - содержит результат работы preg_replace (см. выше). // === Заносим ключи поиска в массив $sorted_regexp_array $sorted_regexp_array=preg_split("/s+/", $sorted_regexp); // === Удаляем дублирующиеся значения в массиве $sorted_regexp_array=array_unique($sorted_regexp_array); // === Сортируем массив $sorted_regexp_array в порядке убывания // === функция rev_sort_by_length - приведена выше. usort($sorted_regexp_array, "rev_sort_by_length"); // === Объединяем отсортированные значения массива в строку. $searchquery_regexp=implode("|", $sorted_regexp_array); // === Заключаем результат в круглые скобки - группируем наш REGEXP $searchquery_regexp=preg_replace("/.+/","($0)", $searchquery_regexp); ?> Таким образом если переменная $searchquery содержала строку "@ @list.ru", то после выполнения описанных выше действий $searchquery_regexp будет содержать строку следующего вида "(@list.ru|@)". Сгенерированное регулярное выражение содержащееся в $searchquery_regexp готово к дальнейшему использованию. Например следующим образом:
$string_to_output=preg_replace(!$searchquery_regexp!i, #FFFF00;'>$0</SPAN>", $string_where_search);
"<SPAN
STYLE='background-color:
Обратите внимание на то что шаблон поиска заключен не в /, а в ! - иначе будет выдано сообщение об ошибке. Все, если в переменной $string_where_search содержащей строку будет найдено соответствие одному из ключей поиска - участок строки или слова будет заключен (в данном случае) в тег иначе строка останется без изменений. Если используем шаблоны (Smatry Templates): <? {$string_where_search|regex_replace:"!$searchquery_regexp!i":"<SPAN #FFFF00;'>$0</SPAN>"} ?>
STYLE='background-color:
Таким образом, при поиске в таблице по нескольким столбцам, можно назначить каждому столбцу свой стиль (цвет) выделения. Например: все найденные соответствия поиску в первой колонке выделять жирным шрифтом, а все соответствия во второй колонке синим цветом и т.д. Хоть по времени суток менять цвет или шрифт найденных значений. ЗАМЕЧАНИЕ: Выделение является языкозависимым. Т.е. если в строке поиска будет введен символ "a" в русской раскладке то выделены будут только русские символы "a". И соответственно если строка поиска введена в английской раскладке выделены будут только английские символы. Этим можно воспользоваться там где необходимо многоязыковое выделение. Также при поиске в русскоязычном тексте учитывается регистр. Т.е. если в тексте есть "a" и "A" и ключом поиска был задан символ "a" (в русской раскладке), то будут выделены все "a", но не "A". Т.е. поиск чувствителен к регистру не смотря на флаг i. Это замечание не относится к англоязычному тексту. Собираем все в функцию: <? function sort_by_length ($cur_val, $next_val) { $cur=strlen($cur_val); $next=strlen($next_val); if ($cur==$next) return 0; return ($cur<$next)?-1:1; } function generate_regexp_from_query ($searchquery, $search="", $replace="") { $search = trim($search); $replace = trim($replace); if (empty($search) || empty($replace)) { $search = array( "/\\\\/", "/([rn])[s]+/", "/s*(.+)s*/", ); $replace = array( "\", " ", "$1",
); } $sorted_regexp = preg_replace($search, $replace, preg_quote($searchquery)); $sorted_regexp_array = array(); $sorted_regexp_array = preg_split("/s+/", $sorted_regexp); $sorted_regexp_array = array_unique($sorted_regexp_array); usort($sorted_regexp_array, "rev_sort_by_length"); $searchquery_regexp = implode("|", $sorted_regexp_array); $searchquery_regexp = preg_replace("/.+/","($0)", $searchquery_regexp); return $searchquery_regexp; } ?> Заключение: Описанный пример выделения текста является более гибким инструментом выделения, чем встроенная функция highlight_string в которой нет свободы выбора. Что само по себе неприятно. Гораздо интересней, когда возможности ограничиваются только фантазией и не приходится каждый раз выдумывать велосипед. А тратить драгоценное время на творчество. Об 1, data-configid="14833595/10634128" 2,href http://issuu.com/samvelpoghosyan/docs/___________________________________? e=14833595/10634128