9 июл. 2008 г.

Организация "блогоскопища" (с) (tm) 2008 F17 :) Деталь четыре.

Важная деталь для изготовления Блогоскопища (с) (tm) 2008 F17 :) - клонатор баз данных блогов.
Клонировать заготовку блога на движке вордпресс можно с минимальными телодвижениями, если взять дамп блога-заготовки, например, с помощью PHPmyAdmin, и заменить в нем необходимые элементы: домен/субдомен, тайтл, деск, киворды, мыло админа, хэш пароля и т.п. А затем залить этот дамп тем же PHPmyAdmin в качестве нового. Не нужно ничего админить - можно сразу срать нет генерировать нет спамить нет сплогить, а-а-а вот: постить в блог :)
Так я и делал, при этом не придал особого значения, что сбиваются некоторые настройки некоторых плагинов. Подумал, ничего страшного, поправил вручную и нормально.
Но сегодня меня это достало и я решил разобраться, что там ломается.

Всё оказалось печально.

Если заменямая строка является элементом массива и изменяется её длина, то необходимо скорректировать число, указывающее сериализатору ПХП длину строки в массиве.
Было так (фрагмент):
;s:31:"http://feeds.feedburner.com/aaa";
Так неверно:
;s:31:"http://feeds.feedburner.com/bbbbbb";
Правильно так:
;s:34:"http://feeds.feedburner.com/bbbbbb";

Вот регулярка для выделения таких элементов

if(!preg_match_all("|;s:[0-9]+:\"[^\"]*".$sample_for_search."[^\"]*\";|uUi", $dump, $matches)){
return false;
if(!isset($matches[0][0])){ // не сработало
return false;
}
}

Теперь в массиве $matches[0] находятся строки в которых есть $sample_for_search и, при этом, являются элементами массива. Теперь всё просто - выделить строку в кавычках
if(preg_match("|\"(.*)\"|uUi", $match, $matches2)){ // $matches2[1] - содержимое кавычек

Заменить в ней то, что нужно, и собрать элемент массива с новой длиной строки
PS
Уже неделю читаю ридер пять минут в день, так что удалять-добавлять никого не придется - просто некогда.

2 комментария:

lasc комментирует...

а лучше сделать: unserialize -> str_replace -> serialize

к тому же данные серелизованные на одной плащадке могут вполне не открыться на другой

F17 комментирует...

Спасибо, полезно и правильно, приму на вооружение.

Но всё равно нужно сначала из дампа добыть строки с сериализованными массивами другой регуляркой. Потому что эта регулярка достает самый внутренний вложенный элемент, а нужно добывать весь массив целиком.

К тому же некоторые заменяемые строки лежат не в массивах, а просто в записях базы данных.

В следующей версии клонатора блогоскопища попробую.

PS
Блог про Новую Зеландию впечатлил.