Модераторы: Aliance, skyboy, MoLeX, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [RegEx]извлечение слов из строки, с (вложенными)кавычками 
V
    Опции темы
kasmanaft
Дата 20.11.2007, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 16.11.2007

Репутация: 1
Всего: 2



Цитата(Splendid @  20.11.2007,  17:06 Найти цитируемый пост)
т.е. теперь пользователь может вводить только русские и англ. буквы и цифры...так?

Ну, он может вводить что захочет, но искаться будут только перечисленные smile 

Раньше, вроде бы, так же было.. Разве нет? И "Notice: Undefined variable" по идее должна была выскакивать при аналогичном вводе.

Сейчас он ищет то, что находится в кавычках и то, что перечисленно во втором выражении
$reg = '/(?:\+|-)?\b[a-zA-Zа-яёА-ЯЁ0-9-_]+\b/is';
Это выражение можно на словах расписать так: возможно стоит плюс или минус, после которого идут перечисленные в кв. скобках буквы/числа.

Если нужно искать всё, что введет пользователь, можно квадратные скобки заменить на "\S".
Если хотите ограничить длинну слова (чтобы исключить из поиска слишком короткие слова), можно после квадратных скобок (или \S - что выберете) убрать "+" и поставить "{3,}" - будет искать слова только от трех "букв" и больше.

Вместо это проверки
Код

 if ($search == '')
 {echo '</br>';
   echo " <center><br> Вы ничего не ввели в окно поиска.
    Пожалуйста, повторите ввод. </br></center>";
 }
лучше проверить, что вернула функция. 




Итак. Исходя из вышесказанного, налепил вот что:
Код

<?php
function prepareWhere($search, $fields)
{
    // Разбираем строку на слова
    $reg = '/"(?=\S)(?:[^"]*|(?R))*(?<=\S)"/is';
    preg_match_all($reg, $search, $words1, PREG_PATTERN_ORDER);
    $search = preg_replace($reg, "", $search);
    $reg = '/(?:\+|-)?\b[a-zA-Zа-яёА-ЯЁ0-9-_]+\b/is';
    preg_match_all($reg, $search, $words2, PREG_PATTERN_ORDER);
    $words[0] = array_merge($words1[0], $words2[0]);
    
    $words_groups = array();
    $words_groups['include']=array();
    $words_groups['exclude']=array();
    $words_groups['any']=array();
    
    // Каждое слово обрабатываем, определяем его тип
    foreach( $words[0] as $word )
    {
        if( strlen($word) > 0 ) // Если слово не пустое, то продалжаем с ним
        {
            $word = trim($word, '"');
            $word = mysql_real_escape_string($word);
            $word = addCslashes($word, '_%');
            switch( $word[0] )
            {
                case '+': // Обязательные слова
                    $words_groups['include'][] = substr($word, 1);
                    break;
                case '-': // Ненужные слова
                    $words_groups['exclude'][] = substr($word, 1);
                    break;
                default: // Наличие хотя бы одного слова
                    $words_groups['any'][] = $word;  
            }
        }
    }
    
    // "Группируем" группы слов, учитывая поля 
    $words_rules = array();
    $words_rules['include'] = array();
    $words_rules['exclude'] = array();
    $words_rules['any'] = array();
    
    foreach( $fields as $field )
    {
        // Ненужные слова
        if( count($words_groups['exclude']) > 0 )
            $words_rules['exclude'][] = ' ('.$field.' NOT LIKE "%'. implode('%" AND '.$field.' NOT LIKE "%', $words_groups['exclude']) .'%" OR '.$field.' is null) ';
        
        // Наличие хотя бы одного слова            
        if( count($words_groups['any']) > 0 )
            $words_rules['any'][] = ' ('.$field.' LIKE "%'. implode('%" OR '.$field.' LIKE "%', $words_groups['any']) .'%") ';
    }
    
    if( count($words_groups['include']) > 0 ) 
        foreach( $words_groups['include'] as $word )
            $words_rules['include'][] = ' ('.implode(' LIKE "%'.$word.'%" OR ', $fields).' LIKE "%'.$word.'%") ';
            
    
    // Объединяем результаты
    if( count($words_rules['include']) > 0 )
        $where['include'] = '('.implode(' AND ', $words_rules['include']).')';
    if( count($words_rules['exclude']) > 0 )
        $where['exclude'] = '('.implode(' AND ', $words_rules['exclude']).')'; 
    if( count($words_rules['any']) > 0 )
        $where['any'] = '('.implode(' OR ', $words_rules['any']).')';
   
    if (!empty($where['include']) || !empty($where['exclude']) || !empty($where['any']))
        $where = implode(' AND ', $where);
    else $where = "";
    
    return $where;
}

$where = prepareWhere('fgdf', array(''));

if (empty($where))
{
    echo '</br>';
    echo " <center><br> Вы ничего не ввели в окно поиска.
    Пожалуйста, повторите ввод. </br></center>";
} else {
    /* можно выполнять поиск, используя приготовненную where */
    echo $where;
}

?>
(поправте как надо второе выражение)

PS опять забыл про mysql_real_escape_string(). Обновил smile 

Это сообщение отредактировал(а) kasmanaft - 20.11.2007, 14:41
PM MAIL   Вверх
Splendid
Дата 20.11.2007, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 1.8.2007
Где: Беларусь, Минск

Репутация: нет
Всего: нет



вроде как понятно...smile

Спасибо огромное еще раз!
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0397 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.