Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > регулярка


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

в БД хранится упакованный 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?

Автор: baldina 14.8.2012, 17:14
Код

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

Автор: baldina 14.8.2012, 17:29
Код

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

Автор: bars80080 14.8.2012, 17:56
что-то она не до конца доведена:

Код

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 . ').*?"\'';



Автор: ksnk 14.8.2012, 18:31
Цитата(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...

Автор: baldina 14.8.2012, 19:14
на mysql я её не пробовал  smile 
json_encode кавычки вставляет, не учел, сорри

Автор: bars80080 28.8.2012, 11:03
что-то оно всё равно не работает:

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

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 . ').*?"\'';

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

Автор: bars80080 28.8.2012, 11:25
аналогично:

Код

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 секунды
не фига не ищет, правда

Автор: patap 28.8.2012, 18:35
пропустили кавычку
"fio":(.

Автор: bars80080 29.8.2012, 10:38
ага, именно в этом дело и было.

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

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

Код

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)