Регулярное выражение для добавления атрибута в любые теги XML - PullRequest
4 голосов
/ 31 августа 2009

У меня правильно сформированные XML-документы в строковые переменные. Я хочу использовать preg_replace для добавления определенного атрибута к каждому тегу xml.

Например, заменить:

<tag1>
<tag2> some text </tag2>
</tag1>

по:

<tag1 attr="myAttr">
<tag2 attr="myAttr"> some text </tag2>
</tag1>

Так что мне в основном нужно выражение регулярного выражения, чтобы найти любые начальные теги и добавить свой атрибут, но я полон регулярного выражения.

Ответы [ 3 ]

13 голосов
/ 31 августа 2009

Не используйте регулярные выражения для работы с XML. XML не является обычным языком. Вместо этого используйте xml-расширения php :

$xml = new SimpleXml(file_get_contents($xmlFile));
function process_recursive($xmlNode) {
    $xmlNode->addAttribute('attr', 'myAttr');
    foreach ($xmlNode->children() as $childNode) {
        process_recursive($childNode);
    }
}
process_recursive($xml);
echo $xml->asXML();

Все ответы, содержащие регулярные выражения, будут нарушать этот действительный xml, например:

<?xml version="1.0" encoding='UTF-8'?>
<html>
    <head>
        <!-- <meta> ... </meta> -->
        <script>//<![CDATA[
            function load() {document.write('<tt>Test</tt>');}
        //]]></script>
        <title><![CDATA[Fancy <<SiteName>> [with Breadcrumbs] > in > title]]></title>
    </head>
    <body onload="load()">
        <input
            type="submit"
            value="multiline
                   button
                   text"
        />
    </body>
</html>
0 голосов
/ 02 сентября 2009

ОК, для тех, кто читает эти строки и по каким-то причинам все еще интересуется использованием метода регулярных выражений, вот как это сделать:

$xml_data= preg_replace('/(<[A-Za-z0-9\-\_]+[^>]*)>/u','\1 attr="myAttr">',$xmlData);

Но, как обсуждалось ранее, используйте это с осторожностью! Используйте его только в XML-источнике, который, как вы знаете, не будет сломан (см. soulmerge сообщение об этом)

0 голосов
/ 31 августа 2009
$xml_data = preg_replace("/<([^\/]+\w+)/", "<\\1 attr=\"myAttr\">", $xml_data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...