Как массово изменить участки кода в файле?

194
16 августа 2017, 19:35

Имеется файл 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>
Answer 1

По хорошему, конечно, надо парсить 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>
Answer 2

Если файл не велик и полностью убирается в оперативную память, как вариант можно воспользоваться регулярными выражениями и функцией 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);
READ ALSO
как запустить сокет-сервер на хостинге

как запустить сокет-сервер на хостинге

я создал сайт "pg-tsttk" на хостинге 000webhost

170
Vk Streaming API добавления правил PHP

Vk Streaming API добавления правил PHP

Здравствуйте, относительно недвано Вконтакте открыла Streaming API, но информации по ней не много 2 статьи на хабре, и документация с примерами...

169
Отправить POST запрос PHP

Отправить POST запрос PHP

Здравствуйте, нужно на данный URL https://streamingvk

161