Требуется составить регулярное выражение для PHP

Статус
В этой теме нельзя размещать новые ответы.

krobol

Постоялец
Регистрация
5 Июн 2008
Сообщения
455
Реакции
126
Помогите составить регулярное выражение для preg_match_all.
Если база данных, вот из неё кусок (3 строки) :
Код:
s:7:"upgrade";b:0;s:8:"insecure";b:0;}', 'yes');
INSERT INTO `wp_options` VALUES (3, 'siteurl', 'http://domen.com', 'yes');
INSERT INTO `wp_options` VALUES (89, 'widget_text', 'a:2:{i:2;a:3:{s:5:"title";s:0:"";s:4:"text";s:38:"<a href="http://domen.com/">ANCHOR</a>";s:6:"filter";b:0;}s:12:"_multiwidget";i:1;}', 'yes');

необходимо выбрать все значения длин строк данных s:<число>, где содержится имя домена "domen.com".

Само значение s:<число> выбрать могу:
PHP:
s:([0-9]+):
а вот только те, где есть домен, не могу.
Сложность в том, что s : X : "строка" - X - это длина строки в кавычках, но в строке тоже могуть быть кавычки ".
 
Я не совсем уверен, что в данном случае целесообразно использовать регулярки. По крайней мере, я не вижу в этом смысла. Сериализированный массив можно конвертнуть в обычный массив и работать с этим массивом. Если использование регулярок на столько критично, то в данном примере недостаточно данных для работы. Нужно, по крайней мере, знать какие варианты текстовой инфы могут присутствовать в этом текстовом поле. Например, если там всегда присутствует тег анкера, то можно пробовать цеплять регулярку за него:
Код:
s:([0-9]+):\<\"a\s\href
 
Цель: заменить в дампе БД Wordpress имя домена на другой. Если менять просто заменой, то нарушится целостность сериализованных массивов.
Скрипт у меня есть и он работает, но иногда даёт сбои. Стал разбираться почему. Оказалось, что из-за того, что в строке данных массива, заключённой в кавычки тоже могут содержаться кавычки.
Можно и без регулярки, но тогда нужно выбирать сами массивы, искать в них домен и вписывать их обратно на то же место, как выбирать и как вписывать обратно?
Код:
'a:2:{s:8:"platform";s:7:"Windows";}'
Насколько я понимаю, в данных также может встретиться }. Получается та же проблема, что и с кавычкой ".

---
Домен может присутствовать в любых вариантах. И с http и совсем без всего, только domen.com
 
Подобные операции проще всего осуществить полностью на MySQL. Он поддерживает как работу с регулярными выражениями, так и работу с большинством текстовых процедур.

P.S. Не пойму, в чем проблема вписать обратно. Выбрать из БД, разобрать сериализированый массив, провести замены. Собрать обратно сериализированую строку и обновить данные в БД. Только вместь инсертов использовать аптейды. Но опять-же, я лично не фанат цыкличных обращений к БД, потому, я бы такие операции проводил только посредством единого SQL запроса.
 
Код:
$str="INSERT INTO `wp_options` VALUES (89, 'widget_text', 'a:2:{i:2;a:3:{s:5:\"title\";s:0:\"\";s:4:\"text\";s:38:\"<a href=\"http://domen.com/\">ANCHOR</a>\";s:6:\"filter\";b:0;}s:12:\"_multiwidget\";i:1;}', 'yes');";
 
preg_match_all('/s:([\d]+):"<[^<]+domen\.com[^>]+>/',$str,$matches);
print_r($matches);
Код:
Array
(
    [0] => Array
        (
            [0] => s:38:"<a href="http://domen.com/">
        )
 
    [1] => Array
        (
            [0] => 38
        )
 
)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху