Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2011, 20:37   #1
mrgrudge
Форумчанин
 
Аватар для mrgrudge
 
Регистрация: 20.02.2010
Сообщений: 229
Злость одна из функций для поиск

Вообщем есть функция которая разбивает строку
PHP код:
 function parse_name($name)
    {
        
$words explode(" ",$name);
        {

            for(
$i=0;$i<count($words);$i++)
            {
                if(
preg_match("/^:/",$words[$i]))
                {
                    
$aux_arr explode(":",$words[$i]);
                    unset(
$words[$i]);
                    
$aux_arr[count($words)+1] = $aux_arr[0];
                    
$aux_arr[count($words)+2] = $aux_arr[1];
                }
            }
            return 
$words;
            
        }
    } 
проблема заключается в том что в строке может быть символы : или " или ' или еще какие либо ковычки.
и когда строка проходит explode не всегда верно разбивка происходит.
ну что то вроде слово1:слово2 и после чего соответствие по такому слову где-то искать будет не правильно. Что привело меня к регулярным выражениям. Но с паттерном вот что-то никак не совладаю. Нужно найти как то паттерне эти символы, и если нашел то опять explode.
думай как баг, действуй как баг, и ты найдешь баг )
mrgrudge вне форума Ответить с цитированием
Старый 22.06.2011, 13:04   #2
graymaster
Форумчанин
 
Аватар для graymaster
 
Регистрация: 03.05.2011
Сообщений: 158
По умолчанию

Что-то не понятно, что именно вы хотите сделать.

Вы хотите или НЕ хотите, что бы строка разбивалась, если там есть кавычки (какие-бы-то-ни-было) ?
Если вы хотите разбить строку любым знаком из набора к примеру {",',:,`,<space>}, то гораздо проще было бы просто заменить их всех пробелами (воспользуйтесь $t=strtr($t,'\'":`',' '); ) а потом разбить всю строку по пробелам $words = explode(" ",$name);.
Если же вы НЕ хотите этого делать в присутствии кавычек - детекте кавычки
if ($name[0]==$name[strlen($name)-1] && in_array($name[0],array('\'','"','`'))) и не разбивайте строку в этом случае.

Последний раз редактировалось graymaster; 22.06.2011 в 13:24.
graymaster вне форума Ответить с цитированием
Старый 24.06.2011, 11:44   #3
mrgrudge
Форумчанин
 
Аватар для mrgrudge
 
Регистрация: 20.02.2010
Сообщений: 229
По умолчанию

Да действительно проще заменить их все пробелами! Спасибо!
Но тут возникла еще одна проблема, после разбивки строки на слова. Мне нужно съездить в базу и посмотреть где совпадают строки по 1 до 3х слов чтоб не было дублирования в базе. Может есть какой фокус в sql запросах который позволяет делать то то подобное. А то у меня сейчас забираются все записи из тбалицы, так же разбиваются и сравниваются с пословно с той что пришла. но это сильно трудоемко при учете что база растет на записей 150 в год и одновременных стро для проверки может быть довольно много (появляются чтением xml файла).
думай как баг, действуй как баг, и ты найдешь баг )
mrgrudge вне форума Ответить с цитированием
Старый 26.06.2011, 13:53   #4
graymaster
Форумчанин
 
Аватар для graymaster
 
Регистрация: 03.05.2011
Сообщений: 158
По умолчанию

Можно, конечно, задействовать LIKE и т.п. (в стиле SELECT * FROM THE_TABLE WHERE ARTICLE_TEXT LIKE ' %word1% ' AND ARTICLE_TEXT LIKE ' %word2% '), но это будет всего лишь перекладывание работы с httpd на mysql. Если работы реально много, то это не окажет сильного влияния. Можно ещё full-text индексацию добавить (даже нужно, на самом деле).
Но это всё меркнет по сравнения со скоростью обработки LIKE запросов. Это очень медленно. Если, конечно, у вас база - это 500 записей и +150 записей в год, и меньше 1000 поисковых запросов в день, то этим можно ограничиться, даже немощный mysql с этим справится.
Если база больше - то вам, скорее всего придётся заняться индексацией поиска. Если подходить серьёзно и нормализовать базу, то надо будет сделать как-то так:
Создать таблицу со связкой id<->слово праймари кей id+индексация по слову.
Создать таблицу со связкой id слова<->id статьи и заполнить её всеми словами, что есть в статьях.
При добавлении новой статьи она разбивается на слова. Все слова, коорых ещё нет в таблице слов, туда добавляются. Потом добавляются связки слово-статья во вторую таблицу.
Поиск работает так: разбиваете поиск на слова. Вытаскиваете id статей таким вот образом примерно:

$q="SELECT DISTINCT ID FROM ARTICLE_TABLE AS AT
INNER JOIN ARTICLE_WORDS_TABLE AS AWT ON AWT.ARTICLE_ID=AT.ID
INNER JOIN WORDS_TABLE AS W ON W.ID=AT.WORD_ID
WHERE W.WORD IN ('".implode("','",$array_of_the_sea rch_words)."')";


/* это я так писал, без проверки, поэтому проверять и отлаживать - надо */

Плюс, что бы всё работало достаточно быстро, надо индексировать все поля, по которым идёт поиск. ключ id слова<->id статьи должен быть юник. (можно ещё каунт сделать, насколько часто это слово встречается в статье, но это уже дальнейшее развитие темы.)

Последний раз редактировалось graymaster; 26.06.2011 в 13:57.
graymaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ещё одна прога для студентов, тестирование с помощью программы ADSoft Tester - взлом пароля rpy3uH Софт 70 23.12.2021 21:47
Одна внешняя ссылка для большой формулы almik Microsoft Office Excel 8 11.04.2011 14:48
Одна процедура для всех Edit(ов) SoftKoc Общие вопросы Delphi 7 23.01.2010 13:44
Поиск экстремумов функций DJEDY Общие вопросы C/C++ 2 07.04.2009 14:21
Одна функция для нескольких объектов Salomon Помощь студентам 2 25.11.2008 16:32