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

Форум Регулярные Выражения

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

 

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

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

тема: Регулярное выражение для пропуска пробелов
 
 автор: Владимир55   (28.05.2013 в 17:39)   письмо автору
 
 

Для поиска по базе используется выражение:
$query = "SELECT * FROM kattov WHERE artikul = '$NUMBER' ";  

На практике содержимое ячейки artikul может отличаться от образца наличием произвольно расположенных пробелов.
Например,
24024 170s 
24 02 4 170 s 
2402 4170  s   

Как средствами REGEXP составить запрос таким образом, чтбы при $NUMBER = 24024170s были найдены все три перечисленные записи?

Если подготовить запрос так:
`artikul` REGEXP '^ *2 *4 *0 *2 *4 *1 *7 *0 *s *$' 
регистр букв будет учитываться?
И вообще, так можно делать?

  Ответить  
 
 автор: cheops   (28.05.2013 в 21:23)   письмо автору
 
   для: Владимир55   (28.05.2013 в 17:39)
 

Если это не часто выполняемый запрос, поступите проще: удалите пробелы на время выполнения запроса
$query = "SELECT * FROM kattov WHERE REPLACE(artikul, ' ', '') = '$NUMBER' "; 

Сам столбец затронут не будет, а вместо него будут нормализованные значения. Индексами, если есть, правда воспользоваться не получится (впрочем в MySQL, другие базы данных, например, PostrgreeSQL позволяют строить индексы по выражениям), зато получите то, что вам нужно.

  Ответить  
 
 автор: Владимир55   (29.05.2013 в 10:30)   письмо автору
 
   для: cheops   (28.05.2013 в 21:23)
 

Ваше решение оказалось намного лучше!

Запрос с использованием REGEXP занимает 4.35 сек, тогда как при замене с помощью REPLACE требуется всего лишь 0.81 сек!

Для сравнения: запрос без обработки пробелов требует 0,73 сек. То есть, потеря времени при использовании REPLACE вполне допустима.

Спасибо!

  Ответить  
 
 автор: Sfinks   (29.05.2013 в 11:37)   письмо автору
 
   для: Владимир55   (29.05.2013 в 10:30)
 

REGEXP и LIKE - самые медленные операторы. Ими стоит пользоваться только когда НИЧТО другое не подходит.

  Ответить  
 
 автор: Deed   (30.05.2013 в 12:38)   письмо автору
 
   для: cheops   (28.05.2013 в 21:23)
 

А можно ли подобным образом изменить регистр букв в запросе?

  Ответить  
 
 автор: Sfinks   (30.05.2013 в 13:38)   письмо автору
 
   для: Deed   (30.05.2013 в 12:38)
 

каким подобным?
С помощью РВ?
Или с помощью REPLACE?
А смысл?
Для этого есть функция LOWER().

P.S. Если я что-то не так понял, уточните вопрос.
P.P.S. Лучше под новые вопросы заводить новую тему. И в правильном разделе. Этот вопрос уже, по-моему, не имеет отношения к RegExp.

  Ответить  
 
 автор: Deed   (30.05.2013 в 19:47)   письмо автору
 
   для: Sfinks   (30.05.2013 в 13:38)
 

Все, спасибо!
Гм, функция LOWER()...

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

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