2016-01-29 2 views
2

Я ищу поиск в базе данных по сериализованным данным. В настоящее время я использую Symfony2 в качестве моей платформы, создающей вызовы pdo_mysql с использованием Doctrine 2. То, что я хотел бы сделать, это создать запрос, который использует REGEXP для поиска данных в пределах certian-части массива. Данные, которые я пытаюсь найти в выглядит следующим образом: -Регулярное выражение в сериализованных данных

a:1:{s:8:"bedrooms";a:5:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;s:2:"5+";}} 

Так скажем, я ищу запись, которая имеет 3 спальни, то я хотел бы его найти: -

i:2;i:3 

До сих пор я задал вопрос: -

SELECT * FROM table WHERE field_name REGEXP '.*"bedrooms"; a:[0-9]+:{i:[0-9]+;i:3;}.*'; 

Однако это не сработает. Может кто-нибудь помочь мне найти исправление вокруг этого, пожалуйста? Я думаю, что дело доходит до того, как написано регулярное выражение.

Также стоит отметить, что существуют другие массивы, хранящиеся в поле, такие кредитные лимиты и другие данные.

Заранее спасибо.

+0

Как насчет того, чтобы не сериализовать ее в первую очередь? – Sammitch

+0

Это не единственные данные, хранящиеся в сериализованных данных. Есть еще много параметров, которые также хранятся, и поэтому я использовал сериализованные данные. –

+0

Если вы никогда не планируете его запрашивать, обязательно внесите в себ черту. Однако, если вы * можете * когда-либо захотеть запросить * что-либо * в * нормальном режиме, вы не должны сериализовать его. Похоже, это могут быть данные MLS, и я получаю, что данные RETS - это мешок с кошками, но SQL - очень плохой выбор для хранения денормализованных данных. – Sammitch

ответ

2

Я считаю, что вы можете сделать это с помощью инверсного класса символов [^{}], который соответствует любому символу, кроме { и }:

.*"bedrooms";a:[0-9]+:[{][^{}]*i:[0-9]+;i:3[^{}]*[}] 

См regex demo

+1

Фантастический ответ! Эта техника работает отлично. –

0

Я вижу, по крайней мере, 2 ошибки и улучшения, которые вы можете сделать

  • первых, в регулярном выражении падение пробел после "bedrooms";

  • вы должны усиков фигурные скобки, как \{ и \}, так как они не являются дословным для регулярных выражений

  • , если вы заинтересованы в конкретном фрагменте в строке вы должны указать его как группу и сообщить, какие символы находятся вокруг, например

    «спальни»; a: [0-9] +: \ {. * (i: [0-9]; i: 3). * \}

В этом случае при поиске i:*:i:3 где * любая цифра

+0

Спасибо за ваш комментарий Омар. Это выглядит великолепно, и я попробую это. –