замена сериализованного значения в дампе БД

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

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

    krobol

    Регистр.:
    6 июн 2008
    Сообщения:
    455
    Симпатии:
    126
    Есть дамп БД, в котором присутствуют сериализованные значения переменных. Пример:

    Код:
    'a:2:{s:15:\"http://domen.ru\";s:4:\"link\";}'
    
    таких строк много.

    Необходимо заменить "domen.ru" на "drugoidomen.ru" по всему дампу БД. Особенность в том, что надо сменить и s:15

    Помогите составить preg_replace?

    мой вариант (не работает:(
    PHP:
    $db preg_replace(
       
    '%(.*?s:)(.*?)(:\".*?)('.$url1.')(.*?\";.*?)%ie',
       
    "'\$1'.(\$2 + strlen($url2) - strlen($url1)).'\$3'.$url2.'\$5'",
       
    $db
    );
     
  2. EnGeLs

    EnGeLs Постоялец

    Регистр.:
    30 апр 2008
    Сообщения:
    87
    Симпатии:
    21
    Не совсем понятно.. Нужно заменить "domen.ru" ТОЛЬКО на "drugoidomen.ru" или "domen1.ru" на "drugoidomen1.ru","domen2.ru" на "drugoidomen2.ru"? Если первый случай, то это можно сделать без PHP.
     
  3. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    591
    не получится - надо ещё изменять и значение длины строки.

    ТС, что мешает вытянуть сериализованые строки, поменять и воткнуть назад?
     
  4. betatest

    betatest

    Регистр.:
    3 дек 2007
    Сообщения:
    517
    Симпатии:
    127
    а может так

    PHP:
    $db='a:2:{s:15:\"http://domen.ru\";s:4:\"link\";}';

    $url1='http://domen.ru';
    $url2='http://newdomen.ru';

    $db preg_replace(array('#'.$url1.'#','#'.'s:'.strlen($url1).'#'),array($url2,'s:'.strlen($url2)),$db,1);
    всё работает
     
    krobol нравится это.
  5. krobol

    krobol

    Регистр.:
    6 июн 2008
    Сообщения:
    455
    Симпатии:
    126
    Спасибо за помощь!


    Сделал так:
    PHP:
    $db='a:2:{s:15:\"http://domen.ru\";s:4:\"link\";}';

    $url1='domen.ru';
    $url2='newdomen.ru';
    $db preg_replace(
            
    '%s:([0-9]+):\\\"([^"]+)('.$url1.')(.*?)\\\";%ie',
            
    "'s:'.strlen('\\2".$url2."\\4').':\\"."\""."\\2".$url2."\\4\\"."\"".";'",
            
    $db);
    Для этого пришлось более глубоко изучить регулярные выражения. В частности такие конструкции: [0-9]+ и [^"] :ay:
     
Статус темы:
Закрыта.