正则表达式在ant xml标签中添加属性

时间:2009-08-31 13:01:12

标签: php xml regex

我将格式良好的xml文档转换为字符串变量。我想使用preg_replace为每个xml标签添加一个已定义的属性。

例如替换:

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

由:

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

所以我基本上需要正则表达式来查找任何开始标记并添加我的属性,但我是一个完整的正则表达式菜鸟。

3 个答案:

答案 0 :(得分:13)

不要使用正则表达式来处理xml。 Xml不是常规语言。改为使用xml extensions of 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>

答案 1 :(得分:0)

$xml_data = preg_replace("/<([^\/]+\w+)/", "<\\1 attr=\"myAttr\">", $xml_data);

答案 2 :(得分:0)

好的,对于那些阅读这些内容并且仍然对使用正则表达式方式感兴趣的人,出于某些原因,这里是如何做到的:

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

但是,如前所述,请谨慎使用! 仅在您知道不会被破坏的XML源上使用它(请参阅soulmerge发布相关内容)