Класс\функция подготовки данных под поиск

R
На сайте с 20.03.2011
Offline
13
795

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

У меня есть N кол-во полей. Их нужно склеить в одну строку. Конечная строка не должна содержать:

1) знаков препинания

2) слов короче 3-х символов

3) знака переноса строки

4) повторяющихся слов

5) лишних пробелов (подряд два и более пробела)

Все это чудо должно работать с кирилицей.

В общем, кто-что знает...выкладывайте.

Может быть кто-то писал сам и оно работает уже временем.

Я сейчас сижу пишу ... но чувствую что потом еще исправлять и исправлять... а на это времени нет=(

// функция очистки и склеивания сток для поля поиска
private function SearchText($arrayData){
if(is_array($arrayData) && count($arrayData) >0){
$searchStr = "";
foreach ($arrayData as $string){
if(!empty($string)){
$searchText = strip_tags($string);
// Удаляем лишние пробелы
$searchText = preg_replace("/\s+/"," ", $searchText);
// Удаляем знаки припенания
$searchText = preg_replace("/[\.|\,|\-|\_|\?|\!|\:|\#|\*]+/", "", $searchText);
// Удаляем слов короче 3-х символов
$searchText = preg_replace("/[?\s]([^\s]{1,4})[?\s]/", " ", $searchText);
// Удаляем пробелы с начала и конца строки
$searchStr .= trim($searchText)." ";
}
}

$data = array();
$dataStr = explode(" ", $searchStr);
for($i=0; $i < count($dataStr); $i++){
$flag = true;
for($j=0; $j < count($data); $j++){
if($dataStr[$i] == $data[$j]){
$flag = false;
break;
}
}
if($flag)
$data[] = $dataStr[$i];
}
$searchData = implode(" ", $data);

return mb_strtolower(trim($searchData), "UTF-8");
}else
return "";
}

Вот то, что уже есть.

Не получается написать регулярку для удаления слов строго меньше 4-х символов.

$searchText = preg_replace("/[\s]([^\s]{1,4})[\s]/", " ", $searchText);

Этот вариант работает только если удаляемое слово будет окружено пробелами. Пробовал так сделать

$searchText = preg_replace("/[?\s]([^\s]{1,4})[?\s]/", " ", $searchText);

не работает=(

так же меня смущает мой способ удаления знаков препинания

$searchText = preg_replace("/[\.|\,|\-|\_|\?|\!|\:|\#|\*]+/", "", $searchText);

Есть ли какой-то еще способ, кроме как перечислить все?

siv1987
На сайте с 02.04.2009
Offline
427
#1

$str = 'www ffff fqqq site.com \'" yyy ytrrr vvvvv mmmmmm';

$str = preg_replace( '/\W/', ' ', $str );

$str = preg_replace( '/(^|\s)[^\s]{1,4}(\s|$)/', ' ', $str );

$str = preg_replace( '/\s+/', ' ', $str );

$str = trim($str);

R
На сайте с 20.03.2011
Offline
13
#2
siv1987:
$str = 'www ffff fqqq site.com \'" yyy ytrrr vvvvv mmmmmm';
$str = preg_replace( '/\W/', ' ', $str );
$str = preg_replace( '/(^|\s)[^\s]{1,4}(\s|$)/', ' ', $str );
$str = preg_replace( '/\s+/', ' ', $str );
$str = trim($str);

вот это выражение

$str = preg_replace( '/\W/', ' ', $str );

Что-то не то с кирилицей делает.....

артифит краткое описание порошок основе хондроитина глюкозамина для приготовления напитка. г препарат для предотвращения заболеваний поддержания здоровья суставов, улучшения состояния синовиальной жизни, противовоспалительное средство. подробное описание препарат для предотвращения заболеваний поддержания здоровья суставов, улучшения состояния синовиальной жидкости, противовоспалительное средство. компоненты артифита останавливают прогрессирование артрита, регулируют количество качество внутрисуставной смазки, оздоравливают суставную оболочку костную микроструктуру. полное описание препарат для предотвращения заболеваний поддержания здоровья суставов, улучшения состояния синовиальной жидкости, противовоспалительное средство. восстанавливает структуру хрящевой ткани поддерживает эластичность соединительной ткани улучшает состояние синовиальной жидкости оказывает противовоспалительное действие снижает болевые ощущения, вызываемые дегенеративными заболеваниями суставов гидролизованный желатин, глюкозамин сульфат натрия (из панцирей ракообразных), хондроитин сульфат натрия, витамин витамин витамин селеновые дрожжи, окись цинка, сульфат марганца, цитрат меди, хлорид хрома, двуокись кремния, бета-каротин, экстракт мартинии душистой, лимонная кислота (подкислитель), натуральные вкусовые вещества, порошкообразная фруктовая смесь (апельсин, лимон), сукралоза (подсластитель) питательная ценность г (суточная норма) рсн, энергетическая ценность, кдж (ккал) (16) белки г углеводы г них сахара г жиры г пищевые волокна г натрий г глюкозамин сульфат натрия мг хондроитин сульфат натрия мг витамин 1 50 витамин 30 50 витамин 5 50 селен мкг хром мкг марганец мг медь мг цинк мг * соответствии законодательством швейцарии продуктах питания размешать полные кофейные ложки (около г) 200 воды соответствует одной суточной норме взбивать шейкере

это текст на котором я тестирую.

$data = "артифит краткое описание порошок на основе хондроитина и глюкозамина для приготовления напитка. 150 г препарат для предотвращения заболеваний и поддержания здоровья суставов, улучшения состояния синовиальной жизни, противовоспалительное средство. подробное описание препарат для предотвращения заболеваний и поддержания здоровья суставов, улучшения состояния синовиальной жидкости, противовоспалительное средство. компоненты артифита останавливают прогрессирование артрита, регулируют количество и качество внутрисуставной смазки, оздоравливают суставную оболочку и костную микроструктуру. полное описание препарат для предотвращения заболеваний и поддержания здоровья суставов, улучшения состояния синовиальной жидкости, противовоспалительное средство. восстанавливает структуру хрящевой ткани поддерживает эластичность соединительной ткани улучшает состояние синовиальной жидкости оказывает противовоспалительное действие снижает болевые ощущения, вызываемые дегенеративными заболеваниями суставов гидролизованный желатин, глюкозамин сульфат натрия (из панцирей ракообразных), хондроитин сульфат натрия, витамин c, витамин e, витамин b6, селеновые дрожжи, окись цинка, сульфат марганца, цитрат меди, хлорид хрома, двуокись кремния, бета-каротин, экстракт мартинии душистой, лимонная кислота (подкислитель), натуральные вкусовые вещества, порошкообразная фруктовая смесь 2% (апельсин, лимон), сукралоза (подсластитель) питательная ценность 5 г (суточная норма) рсн, % энергетическая ценность, кдж (ккал) 68 (16) белки 2,7 г углеводы 1,3 г из них сахара 0,0 г жиры 0,0 г пищевые волокна 0,0 г натрий 0,1 г глюкозамин сульфат натрия 1000 мг хондроитин сульфат натрия 500 мг витамин b6 1 мг 50 витамин c 30 мг 50 витамин e 5 мг 50 селен 15 мкг 30* хром 30 мкг 30* марганец 1,5 мг 30* медь 0,45 мг 30* цинк 4,5 мг 30* * в соответствии с законодательством швейцарии о продуктах питания размешать 2 полные кофейные ложки (около 5 г) в 200 мл воды соответствует одной суточной норме не взбивать в шейкере";

$data = preg_replace( '/\W/', ' ', $data );
$data = preg_replace( '/(^|\s)[^\s]{1,4}(\s|$)/', ' ', $data );
$data = preg_replace("/\s+/", " ", $data );
$data = trim($data);

echo $data;

Вот код.

В результате я получаю

р� и� кр� кое опис� ние поро� н� основе ондрои� ин� г� юко� мин� я приго� ов� ения пи� г преп� � я предо� вр� ения � о� ев� ни� поддер� ния доровья сус� вов у� ения сос� ояния синови� ьно� и� про� ивовосп� и� ьное средс� подро� ное опис� ние преп� � я предо� вр� ения � о� ев� ни� поддер� ния доровья сус� вов у� ения сос� ояния синови� ьно� идкос� про� ивовосп� и� ьное средс� компонен� р� и� ос� н� ив� прогрессиров� ние р� ри� регу� ирую� ко� ес� и � ес� вну� рисус� вно� см� ки дор� ив� сус� вную о� ку кос� ную микрос� рук� уру по� ное опис� ние преп� � я предо� вр� ения � о� ев� ни� поддер� ния доровья сус� вов у� ения сос� ояния синови� ьно� идкос� про� ивовосп� и� ьное средс� восс� н� ив� рук� уру ря� ево� к� поддер� ив� � и� нос� соедини� ьно� к� у� � е� сос� ояние синови� ьно� идкос� ок� � е� про� ивовосп� и� ьное де� вие сни� е� о� ев� о� ения � в� ем� дегенер� ивн� � � ев� ниями сус� вов гидро� ов� нн� е� � юко� мин су� � � рия н� ире� коо� � � ондрои� су� � � рия ви� мин ви� мин ви� мин се� енов� дро� и окись инк� су� � рг� � и� � меди � орид ром� двуокись кремния е� ро� экс� к� р� инии ду� ис� имонн� кис� � подкис� е� � ур� ьн� вкусов� ве� ес� поро� коо� � я рук� ов� смесь пе� ьсин имон сукр� о� подс� с� е� пи� � ьн� � еннос� 5 су� н� норм� рсн энерге� еск� � еннос� кд� кк� е� 2 г уг� евод� 3 и� ни� � р� 0 � ир� 0 пи� ев� во� окн� 0 н� ри� 1 г� юко� мин су� � � рия мг ондрои� су� � � рия мг ви� мин 1 50 ви� мин 30 50 ви� мин 5 50 се� 15 мкг ром мкг рг� не� 5 30 медь 45 30 инк 5 30 соо� ве� вии � конод� е� ьс� вом ве� � рии продук� � пи� ния � ме� � 2 по� е ко� н� � ки око� 5 200 вод� соо� ве� вуе� одно� су� но� норме в� ив� ь � кере

Методом тыка было установлено, что в черных фигнях виновата строка

$data = preg_replace( '/\W/', ' ', $data );

и слова меньше 3-х символов не удаляются... или не все...

В частности меня бесит буква "г" в этом участке текста

напитка. г препарат

я по ней ориентируюсь работает скрипт или нет...

siv1987
На сайте с 02.04.2009
Offline
427
#3

http://www.google.ru/search?hl=ru&newwindow=1&client=opera&rls=ru&q=preg_replace+%D0%B8+utf-8&oq=preg_replace+%D0%B8+utf-8

$str = 'вввв уууу ывыввв site.com \'" ыыы куккккк аа ппппппп';

$str = preg_replace( '/[^а-яa-z]/ui', ' ', $str );

$str = preg_replace( '/(^|\s)[^\s]{1,3}(\s|$)/u', ' ', $str );

$str = preg_replace( '/\s+/', ' ', $str );

$str = trim($str);

echo $str;

R
На сайте с 20.03.2011
Offline
13
#4
siv1987:
http://www.google.ru/search?hl=ru&newwindow=1&client=opera&rls=ru&q=preg_replace+%D0%B8+utf-8&oq=preg_replace+%D0%B8+utf-8

$str = 'вввв уууу ывыввв site.com \'" ыыы куккккк аа ппппппп';
$str = preg_replace( '/[^а-яa-z]/ui', ' ', $str );
$str = preg_replace( '/(^|\s)[^\s]{1,3}(\s|$)/u', ' ', $str );
$str = preg_replace( '/\s+/', ' ', $str );
$str = trim($str);

echo $str;

хм... про глюк с UTF-8 не знал, спасибо.

И за решение тоже спасибо=)

Вот готовое решение. Может кому-то пригодится.

//	Функция очистки и склеивания сток для поля поиска

// Возвращает строку со словами
// $arrayData - массив строк
private function SearchText($arrayData){
if(is_array($arrayData) && count($arrayData) >0){
$data = "";
foreach ($arrayData as $string)
$data .= strip_tags($string)." ";

// Перевод в нижний регистр
$data = mb_strtolower(trim($data), "UTF-8");
// Очиста от лишних знаков
$data = preg_replace( '/[^а-яa-z]/ui', " ", $data );
// Очистка от слом меньше 3-х символов
$data = preg_replace( '/(^|\s)[^\s]{1,3}(\s|$)/u', ' ', $data );
// От лишних пробелов
$data = preg_replace("/\s+/", " ", $data );
$data = trim($data);

// Выборка уникальных слов
$temp = array();
$dataWords = explode(" ", $data);
for($i=0; $i < count($dataWords); $i++){
$flag = true;
for($j=0; $j < count($temp); $j++)
if($dataWords[$i] == $temp[$j]){
$flag = false;
break;
}
// Если такого слова еще нет - добавляем
if($flag)
$temp[] = $dataWords[$i];
}
return implode(" ", $temp);
}else
return "";
}

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