Поиск по сайту в БД Mysql.

12
F
На сайте с 06.02.2012
Offline
138
1339

Нужен обычный поиск в БД, он везде расписан на страницах инета....

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

В текстовой ячейке с контентом в таблице БД имеем одно или несколько совпадений.

Что дальше?

Как показать одну строку текста а не всю ячейку с полным текстом? Есть ли такая функция для Mysql?

Ведь в ней находятся совпадения независимо от регистра, даже для кирилицы.

А если искать строку в тексте с совпадением с помощью строковых функций или регулярных выражений, опять же всплывает проблема с игнорированием регистра (i) для кирилицы.

В инете все советуют преборазовать текст и запрос в нижний регистр.

И показывать строки с маленькими буквами...?

Вобщем для меня, чайника, это ступор.

Как быть? Что можно сделать, чтобы показать одну строку текстового поля из таблицы, независимо от регистра?

Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#1

Независимость от регистра - collation(для поля) MySQL. Для кодировки utf-8 это utf8_general_ci(case independent вроде расшифровывается).

На счет существования готовой функции не уверен, но что можно написать свою функцию(именно для MySQL) знаю точно.

Подпись))
siv1987
На сайте с 02.04.2009
Offline
427
#2
Милованов Ю.С:
case independent вроде расшифровывается

ci - case isensitive :)

cs - case sensitive

fordzon:
Нужно же, помимо ссылки и тайтла показать кусок текста с поисковым словом. Про это нигде в инете не смог найти нужную инфу.

И что мешает его показать? Или чего-то не так понимаю?

fordzon:

Как показать одну строку текста а не всю ячейку с полным текстом? Есть ли такая функция для Mysql?

Не знаю как насчет одной строки, но можно обрезать начиная с нужной позиции (там, где встречается ключевое слово) нужное количество символов. Это можно сделать даже на php

F
На сайте с 06.02.2012
Offline
138
#3

Так в MySQL всё нормально ищется. Совпадения как раз не зависят от регистра.

Тут стоит вопрос - как показать часть текста с совпадением в результатах поиска?

Независимость от регистра для кирилицы нужна при поиске строки в тексте, если нет возможости показать нужный кусок из большого текста БД.

---------- Добавлено 06.07.2013 в 23:08 ----------

siv1987:
И что мешает его показать? Или чего-то не так понимаю?

Так ведь выводится весь контент страницы из ячейки.

А как показать часть текста из БД с нужным совпадением?

---------- Добавлено 06.07.2013 в 23:10 ----------

siv1987:
но можно обрезать начиная с нужной позиции (там, где встречается ключевое слово) нужное количество символов. Это можно сделать даже на php

КАК????

Строковыми функциями? Регулярками? Так проблема с регистром в кириллице появится.

siv1987
На сайте с 02.04.2009
Offline
427
#4
fordzon:
КАК????
Строковыми функциями? Регулярками? Так проблема с регистром в кириллице появится.

Как? Просто. Получить позицию подстроки в строке http://php.net/manual/en/function.strpos.php

Обрезать строку http://www.php.net/manual/ru/function.substr.php

Для работы регистр-независимого поиска также есть аналогичные функции.

Для работы с многобайтовыми кодировками есть mbstring функции - mb_*

$pos = mb_stripos($string, $keyword, null, 'windows-1251');

if($pos !== false) echo substr($string, $pos, 50);

else echo 'Not found';

F
На сайте с 06.02.2012
Offline
138
#5

Вот mb_ я пока не пробовал... Но просто функции с i не помогают.

Щас испытаю...

Спасибо!

---------- Добавлено 06.07.2013 в 23:58 ----------

Работает!!!

Спасибо!

А можно сделать так, чтоб ключевое слово было не в начале а в середине...?

siv1987
На сайте с 02.04.2009
Offline
427
#6
fordzon:

А можно сделать так, чтоб ключевое слово было не в начале а в середине...?

$pos - н-количество символов. И тут хорошо проверить если позиция не отрицательная, или же установить в ноль.

F
На сайте с 06.02.2012
Offline
138
#7

Хорошо бы вывести строчку целиком, как она есть в тексте. От \n до \n .

Я до этого сделал регулярным выражением типа

$strrr = preg_match("/.*($word).*/i", $text, $arr)

Как раз строчка получается. Но регистр в кирилице попутал все карты

IL
На сайте с 20.04.2007
Offline
435
#8
fordzon:
Как раз строчка получается. Но регистр в кирилице попутал все карты

$strrr = preg_match_all("/.*($word).*/iu", $text, $arr);
... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
F
На сайте с 06.02.2012
Offline
138
#9

ivan-lev,

C флагом /iu вообще не находит совпадений.. даже при поиске цифр.

print_r($arr) выводит Array ( [0] => Array ( ) [1] => Array ( ))

У меня кодировка windows-1251 на сайте. И после соединения прописано mysql_query("SET NAMES cp1251");

u это для UTF-8 вроде....?

F
На сайте с 06.02.2012
Offline
138
#10

Примерно такой вариант наверное устроит..

Разбил контент на строчки по \n и вывожу строчки с совпадениями

$text = explode ("\n", $text);
foreach ($text as $t)
{
$pos = mb_stripos($t, $words, null, 'windows-1251');
if($pos !== false) echo $t;
}

Всем спасибо!

Если будут предложены другие варианты вывода куска текста из контента, с учётом регистра в кирилице, опять же, буду благодарен.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий