Имеется файл xml, в котором присутствуют примерно такие участки кода:
<specs>
<spec id="1002">
<name>test</name>
<value>test</value>
</spec>
<spec id="999">
<name>test</name>
<value>test</value>
</spec>
</specs>
Помимо этого, есть и другой код. Можно ли массово подобный код переделать на
<specs>
<spec id="1002">
<name1002>test</name1002>
<value1002>test</value1002>
</spec>
<spec id="999">
<name999>test</name999>
<value999>test</value999>
</spec>
</specs>
По хорошему, конечно, надо парсить DOM (встроенные функции и классы для этого есть), но, если сильно припёрло и нет времени ждать, то скорее пиши регулярки!
Найти:
"#<spec\s+id=\"(\d+)\"><name>(.+?)</name><value>(.+?)</value></spec>#"
Заменить на:
"<spec id=\"$1\"><name$1>$2</name><value$1>$3</value></spec>"
Проверить можно прямо в консоли в одну строку:
php -r 'echo preg_replace("#<spec\s+id=\"(\d+)\"><name>(.+?)</name><value>(.+?)</value></spec>#", "<spec id=\"$1\"><name$1>$2</name><value$1>$3</value></spec>", "<spec id=\"1002\"><name>test</name><value>test</value></spec>") . PHP_EOL;'
Вернёт:
<spec id="1002"><name1002>test</name><value1002>test</value></spec>
Если файл не велик и полностью убирается в оперативную память, как вариант можно воспользоваться регулярными выражениями и функцией preg_replace_callback()
. Прочитать содержимое файла можно при помощи file_get_contents()
, а записать — file_put_contents()
.
<?php
// str = file_get_contents('specs.xml');
$str = <<<HERE
<specs>
<spec id="1002"><name>test</name><value>test</value></spec>
<spec id="999"><name>test</name><value>test</value></spec>
</specs>
HERE;
$pattern = '|<spec\s+id=["\'](\d+)["\']>\s*<name>(.*?)</name>\s*<value>(.*?)</value></spec>|i';
$str = preg_replace_callback(
$pattern,
function ($match) {
return "<spec id=\"{$match[1]}\">" .
"<name{$match[1]}>{$match[2]}</name{$match[1]}>" .
"<value{$match[1]}>{$match[3]}</value{$match[1]}></spec>";
},
$str
);
echo '<pre>';
echo htmlspecialchars($str);
echo '</pre>';
// <specs>
// <spec id="1002"><name1002>test</name1002><value1002>test</value1002></spec>
// <spec id="999"><name999>test</name999><value999>test</value999></spec>
// </specs>
// file_put_contents('specs.xml', $str);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Здравствуйте, относительно недвано Вконтакте открыла Streaming API, но информации по ней не много 2 статьи на хабре, и документация с примерами...