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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> регулярка 
V
    Опции темы
bars80080
Дата 14.8.2012, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



товарищи, подскажите, пожалуйста, регулярное выражение (и вообще, можно ли сделать такое?

в БД хранится упакованный json'ом текст, надо извлечь те строки, которые имеют соответствующее совпадение.

пример текста в ДБ table.field :
{"numpass":2,"product":[{"ak":"\u0422\u042b","fio":"\u041f\u0435\u0442\u0440 \u041f\u0435\u0442\u0440\u043e\u0432","total":3000,"ticket":""},{"route":"KGD - MOW","datefly":"2012-02-01 12:30:00","fio":"\u041f\u0435\u0442\u0440\u0430 \u041f\u0435\u0442\u0440\u043e\u0432\u0430","total":2000,"ticket":""}]}

пример искомого текста: петр

требуется выбрать те строки, где есть совпадение ... "fio":"...петр..."...

при этом, в fio может быть как \u041f\u0435\u0442\u0440 , так и латиница:
{"numpass":1,"product":[{"ak":"UN","route":"DME - LED","datefly":"2012-09-26 19:10:00","fio":"Ivan Ivanovich"}]}


в принципе, могу ещё до запроса на MySQL на php получить из кириллицы \u041f\u0435\u0442\u0440


как же она будет выглядеть регулярка в MySQL?
PM MAIL WWW   Вверх
baldina
Дата 14.8.2012, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



Код

\"fio\":\".*(\\u041f\\u0435\\u0442\\u0440|петр).*?\"


Это сообщение отредактировал(а) baldina - 14.8.2012, 17:15
PM MAIL   Вверх
baldina
Дата 14.8.2012, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



Код

$name = 'петр';
$name_u = json_encode($name);
$sql = 'select from table where field regexp "\"fio\":\".*(' . $name . '|' . $name_u . ').*?\""';


Это сообщение отредактировал(а) baldina - 14.8.2012, 17:30
PM MAIL   Вверх
bars80080
Дата 14.8.2012, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



что-то она не до конца доведена:

Код

SELECT * FROM `table` WHERE `field` regexp "\"fio\":\".*(петр|"\u043f\u0435\u0442\u0440").*?\""


You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\u043f\u0435\u0442\u0440").*?\""' at line 1

проблема вроде в кавычках, но стоит её устранить, система начинает ругаться иначе:

Код

SELECT * FROM `table` WHERE `field` regexp '"fio":".*(петр|"\u043f\u0435\u0442\u0440").*?"'


Got error 'repetition-operator operand invalid' from regexp

Добавлено через 1 минуту и 48 секунд
Код

$name = 'петр';
$name_u = json_encode($name);

$sql = 'SELECT * FROM `table` WHERE `field` regexp \'"fio":".*(' . $name . '|' . $name_u . ').*?"\'';




Это сообщение отредактировал(а) bars80080 - 14.8.2012, 17:56
PM MAIL WWW   Вверх
ksnk
Дата 14.8.2012, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Цитата(bars80080 @  14.8.2012,  17:56 Найти цитируемый пост)
SELECT * FROM `table` WHERE `field` regexp '"fio":".*(петр|"\u043f\u0435\u0442\u0440").*?"'

место этого должно получится вот так
Код

SELECT * FROM `table` WHERE `field` regexp '"fio:.*(петр|\\u043f\\u0435\\u0442\\u0440).*?"'

все обратные слеши развояюццо  smile 

можно простым replace сделать, можно preg_quote использовать, правда нужно потестировать ее на совместимость с mysql...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
baldina
Дата 14.8.2012, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



на mysql я её не пробовал  smile 
json_encode кавычки вставляет, не учел, сорри
PM MAIL   Вверх
bars80080
Дата 28.8.2012, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



что-то оно всё равно не работает:

реальный запрос, как есть
Код

SELECT * FROM `table` WHERE `field` regexp '"fio:.*(петр|\\u043f\\u0435\\u0442\\u0440).*?"'


error: Got error 'repetition-operator operand invalid' from regexp


Код

                $name_u = json_encode($fio);
                $name_u = str_replace('"', '', $name_u);
                $name_u = mysql_real_escape_string($name_u);
                $fio = mysql_real_escape_string($fio);
                $WHERE = '`field` regexp \'"fio:.*(' . $fio . '|' . $name_u . ').*?"\'';

PM MAIL WWW   Вверх
ksnk
Дата 28.8.2012, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Возможно, нужно не удвоить, а учетверить слеши. Навроде как при использовании в обычных регулярках с ключиком e


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
bars80080
Дата 28.8.2012, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



аналогично:

Код

SELECT * FROM `table` WHERE `field` REGEXP '"fio:.*(петр|\\\\u043f\\\\u0435\\\\u0442\\\\u0440).*?"'


error: Got error 'repetition-operator operand invalid' from regexp

Добавлено через 3 минуты и 36 секунд
всё, решено. не хватало скобок:

Код

SELECT * FROM `table` WHERE `field` regexp '"fio:(.*)(петр|\\u043f\\u0435\\u0442\\u0440)(.*)?"'


ошибка исчезла. теперь надо добиться, чтобы он таки нашёл

Добавлено через 6 минут и 43 секунды
не фига не ищет, правда
PM MAIL WWW   Вверх
patap
Дата 28.8.2012, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



пропустили кавычку
"fio":(.


--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
bars80080
Дата 29.8.2012, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

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



ага, именно в этом дело и было.

всё, теперь ок

Добавлено через 3 минуты и 6 секунд
правильный поиск - с удвоенными слэшами

Код

SELECT * FROM `table` WHERE `field` REGEXP '"fio":"(.*)(петр|petr|\\\\u043f\\\\u0435\\\\u0442\\\\u0440)(.*)?"'

PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




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


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

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