|
|
|
| Доброго времени суток.
Обращаюсь к вам с просьбой помочь в решении следующего вопроса.
Уже на протяжении некоторого времени пытаюсь установить поиск на сайт, который на писан на PHP
На данный момент пока получилось следующее:
1) Форма поиска выглядит следующим образом
<table width="500" border="0" align="center" >
<form action="view_search.php" method="post" name="form_s">
<p><input name="search" type="text" size="50" maxlength="400">
<input class="search_b" name="submit_s" type="submit" value="Поиск">
</p>
</form>
</table>
2) Затем $search летит в файл-обработчик view_search.php
3) Следущим шагом идут проверки данной переменной:
if (isset($_POST['submit_s']))
{
$submit_s = $_POST['submit_s'];
}
if (isset($_POST['search']))
{
$search = $_POST['search'];
}
if (isset($submit_s))
{
if (empty($search) or strlen($search) < 4)
{
exit ("<p>Поисковый запрос не введен, либо он менее 4-х символов.</p>");
}
$search = trim($search);
$search = stripslashes($search);
$search = htmlspecialchars($search);
}
else
{
exit("<p>Вы обратились к файлу без необходимых параметров.</p>");
}
4) И наконец сам код выборки, задача, которого найти в таблице video, в поле title, переменную $search
$result = mysql_query("SELECT * FROM video WHERE title LIKE '%$search%'",$db);
if (!$result)
{
echo "<p>Запрос на выборку данных из базы не прошел. <br> <strong>Код ошибки:</strong></p>";
exit(mysql_error());
}
if (mysql_num_rows($result) > 0)
{
$myrow = mysql_fetch_array($result);
Все работает. Но выполняется только точный поиск. Тоесть, если задать поиск словосочетания, например, "скачать беслатно фильм", то будет происходить поиск именно этого словосочетания, но фразу скачать фильм беслатно, художественный фильм, скачать мультфильм, и т.д. уже находить не будет. Поэтому возникает вопрос, как усовершенствовать поиск, чтобы он искал каждое слово поотдельности и не обращал внимание на окончание в слове? Также хотелось узнать, как подсветить искомые слова другим цветом в результатах поиска?
Заранее огромное спасибо | |
|
|
|
|
|
|
|
для: vovan
(27.10.2010 в 15:18)
| | 1. разбиваете строку запроса (поле из формы) по пробелам на слова.
2. отсекаете слова меньше 3 букв
3. в цикле делаете поиск по оставшимся словам
4. выводите результаты
не обращать внимания на окончания я пока не умею (тут надо русский язык хорошо знать и скрипт ему научить) | |
|
|
|
|
|
|
|
для: elenaki
(27.10.2010 в 15:44)
| | и еще он явно перемудрил с submit_s -ами.
точнее сказать алгоритм полный бред - проверяем существование переменной 1, если она существует создаем переменную 2, если переменная 2 существует - что-то делаем...почему бы сразу не отталкиваться от переменной 1 ? | |
|
|
|
|
|
|
|
для: elenaki
(27.10.2010 в 15:44)
| | >1. разбиваете строку запроса (поле из формы) по пробелам на слова.
>2. отсекаете слова меньше 3 букв
>3. в цикле делаете поиск по оставшимся словам
>4. выводите результаты
>
>не обращать внимания на окончания я пока не умею (тут надо русский язык хорошо знать и скрипт ему научить)
Спасибо, за быстрый ответ.
А можно поподробней, т.к. я в php пока не гуру.
Буду весьма признательным :) | |
|
|
|
|
|
|
|
для: vovan
(27.10.2010 в 15:57)
| | попробуй использовать регулярные выражения:
Например, имеется такой шаблон:
победитель получит
((золотую|позолоченный)
(медаль|кубок))
и строка, в которой ищутся совпадения с этим шаблоном: «победитель получит золотую медаль». Тогда кроме этой фразы будут еще захвачены и выданы как результаты поиска следующие совпадения в подвыражениях: «золотую медаль», «золотую», «медаль», пронумерованные 1, 2, 3 соответственно.
http://www.intuit.ru/department/pl/plphp/class/free/13/4.html | |
|
|
|
|
|
|
|
для: elenaki
(27.10.2010 в 15:44)
| | 3. в цикле делаете поиск по оставшимся словам
В цикле наверное лучше собрать запрос через OR. Гонять запросы в цикле накладненько будет.
Правда найдет и все слова по отдельности. | |
|
|
|
|
|
|
|
для: vovan
(27.10.2010 в 15:18)
| | На счет подсветки - была шикарная тема тут, не нашел.
Вот у меня оттуда функция осталась, немного подработанная правда.
<?
function hidlightText($content, $pattern)
{
$pattern = trim(preg_replace('#\s+#', ' ', $pattern));
$arr = explode(' ', $pattern);
if(preg_match_all('#('.implode('|', array_map('preg_quote', $arr)).')#iu', $content, $out, PREG_OFFSET_CAPTURE))
{
$result = NULL;
$src = 0;
foreach($out[0] as $value)
{
if($value[1] > $src)
$result .= htmlChars(substr($content, $src, $value[1] - $src));
$src = $value[1] + strlen($value[0]);
$result .= '<span style="background-color:#A9DAE0">'.htmlChars($value[0]).'</span>';
}
$result .= htmlChars(substr($content, $src));
}
return $result;
}
|
| |
|
|
|
|
|
|
|
для: Николай2357
(29.10.2010 в 18:33)
| | Нашел.
По поисковому запросу "сырец")))
Наступит склероз, что делать стану... | |
|
|
|
|
|
|
|
для: Николай2357
(29.10.2010 в 18:33)
| | Прошу прощения . Функцию
htmlChars()
нужно заменить на
htmlspecialchars()
Это у меня в скрипте были свои замуты)) | |
|
|
|