Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: REGEXP
 
 автор: designshadow   (11.08.2013 в 23:47)   письмо автору
 
 

Есть такой запрос:
WHERE title LIKE '% $search %' OR title LIKE '$search %' OR title LIKE '% $search' OR title LIKE '$search'


Как сделать чтобы учитывался не только пробел в конце искомого слова(LIKE '$search %') но ещё запятая, точка и такой символ "/"

WHERE title REGEXP '^[ ,./\]$search\[ ,./\]?$'
- подправьте плиз если что не так запросе

  Ответить  
 
 автор: cheops   (12.08.2013 в 07:25)   письмо автору
 
   для: designshadow   (11.08.2013 в 23:47)
 

Уберите ^ и $ - они требуют, чтобы поиск велся с первого символа title и заканчивался последним, т.е. содержало либо $search, либо $search с пробелами и символами препинания вначале или конце, т.е. по факту найти строки с несколькими значениями разделенными запятыми - не реально.

WHERE title REGEXP '[ ,./]?$search[ ,./\]?'

PS Лучше всех конечно и с точки зрения удобства составления запросов и скорости обработки данных под содержимое title выделить отдельную таблицу, связав её с целевой внешним ключом.

  Ответить  
 
 автор: designshadow   (12.08.2013 в 15:14)   письмо автору
 
   для: cheops   (12.08.2013 в 07:25)
 

То что добился сделать это чтобы учитывало запятую в конце таким способом:
title LIKE '% $search %' OR title LIKE '$search %' OR title LIKE '% $search' OR title LIKE '$search' OR LOWER(title) RLIKE '$search,'

  Ответить  
 
 автор: Sfinks   (12.08.2013 в 17:39)   письмо автору
 
   для: designshadow   (11.08.2013 в 23:47)
 

title
--------
hell
hello
,hell
hell.
/hell/
WHERE title REGEXP '[,\./]?hell[,\./]?'
Все кроме hello будет соответствовать.

  Ответить  
 
 автор: designshadow   (12.08.2013 в 19:51)   письмо автору
 
   для: Sfinks   (12.08.2013 в 17:39)
 

WHERE title REGEXP '[,\./]?hell[,\./]?'

Попробовал соль, нашло фасоль :)

  Ответить  
 
 автор: Sfinks   (12.08.2013 в 20:25)   письмо автору
 
   для: designshadow   (12.08.2013 в 19:51)
 

Так вы нигде и не говорили о том что $search - это отдельное слово.
Хотя вынужден согласиться - РВ не точное.
Правильно будет так:
WHERE title REGEXP '[ ,\./]?[[:<:]]hell[[:>:]][ ,\./]?'

  Ответить  
 
 автор: designshadow   (13.08.2013 в 15:02)   письмо автору
 
   для: Sfinks   (12.08.2013 в 20:25)
 

Спасибо, так работает.
Ещё обратил внимание что учитываются слова в кавычках типа "hell"(не прописывая нигде про кавычки).
Но бывают ещё слова в таких кавычках «hell» - прописал в РВ, но не находит:

WHERE title REGEXP '[ «»,\./]?[[:<:]]hell[[:>:]][ «»,\./]?'

  Ответить  
 
 автор: Sfinks   (13.08.2013 в 18:21)   письмо автору
 
   для: designshadow   (13.08.2013 в 15:02)
 

В MySQL весьма урезанные РВ.... Поэтому такие пляски с бубном. Могу сказать, что
hell?
тоже будет найден, Хотя вопроса вроде тоже нигде не указано.

Давайте я переведу это РВ на русский:
[ ,\./]? - пробел, запятая, точка или слеш в количестве 0 или 1 штука
[[:<:]] - левая граница слова
hell - слово
[[:>:]] - правая граница слова
[ ,\./]? - пробел, запятая, точка или слеш в количестве 0 или 1 штука

Вот и получается, что
"hell"
подходит, потому что ноль точек есть, граница слова есть слово есть.

А с «» не прокатывает, видимо потому что MySQL считает что между « и hell границы слова нет. Почему, это уж к разработчикам =)

Получается, что если вам нужно однозначно определить все границы слова, то нужно выкинуть [[:<:]], [[:>:]] и вопросы, а в [ ] перечислить все что по вашему мнению будет считаться удовлетворительной границей слова. Не забывая экранировать спец-символы.

Например так:
WHERE title REGEXP '(^|[ «`\?\!,\'\./"])hell([ »`\?\!,\'\./"]|$)'

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования