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

Тема в разделе "Регулярные выражения", создана пользователем krobol, 29 июл 2012.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. krobol

    krobol

    Регистр.:
    6 июн 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 - это длина строки в кавычках, но в строке тоже могуть быть кавычки ".
     
  2. Viodele

    Viodele Механик

    Administrator
    Регистр.:
    17 дек 2011
    Сообщения:
    114
    Симпатии:
    486
    Я не совсем уверен, что в данном случае целесообразно использовать регулярки. По крайней мере, я не вижу в этом смысла. Сериализированный массив можно конвертнуть в обычный массив и работать с этим массивом. Если использование регулярок на столько критично, то в данном примере недостаточно данных для работы. Нужно, по крайней мере, знать какие варианты текстовой инфы могут присутствовать в этом текстовом поле. Например, если там всегда присутствует тег анкера, то можно пробовать цеплять регулярку за него:
    Код:
    s:([0-9]+):\<\"a\s\href
     
  3. krobol

    krobol

    Регистр.:
    6 июн 2008
    Сообщения:
    455
    Симпатии:
    126
    Цель: заменить в дампе БД Wordpress имя домена на другой. Если менять просто заменой, то нарушится целостность сериализованных массивов.
    Скрипт у меня есть и он работает, но иногда даёт сбои. Стал разбираться почему. Оказалось, что из-за того, что в строке данных массива, заключённой в кавычки тоже могут содержаться кавычки.
    Можно и без регулярки, но тогда нужно выбирать сами массивы, искать в них домен и вписывать их обратно на то же место, как выбирать и как вписывать обратно?
    Код:
    'a:2:{s:8:"platform";s:7:"Windows";}'
    Насколько я понимаю, в данных также может встретиться }. Получается та же проблема, что и с кавычкой ".

    ---
    Домен может присутствовать в любых вариантах. И с http и совсем без всего, только domen.com
     
  4. Viodele

    Viodele Механик

    Administrator
    Регистр.:
    17 дек 2011
    Сообщения:
    114
    Симпатии:
    486
    Подобные операции проще всего осуществить полностью на MySQL. Он поддерживает как работу с регулярными выражениями, так и работу с большинством текстовых процедур.

    P.S. Не пойму, в чем проблема вписать обратно. Выбрать из БД, разобрать сериализированый массив, провести замены. Собрать обратно сериализированую строку и обновить данные в БД. Только вместь инсертов использовать аптейды. Но опять-же, я лично не фанат цыкличных обращений к БД, потому, я бы такие операции проводил только посредством единого SQL запроса.
     
  5. NDK13

    NDK13 Создатель

    Регистр.:
    31 авг 2012
    Сообщения:
    36
    Симпатии:
    14
    Код:
    $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
            )
     
    )
    
     
Статус темы:
Закрыта.