正则expression式来添加任何XML标签中的属性
我有格式良好的XML文件到stringvariables。 我想使用preg_replace来为每个xml标签添加一个定义的属性。
例如replace:
<tag1> <tag2> some text </tag2> </tag1>
通过:
<tag1 attr="myAttr"> <tag2 attr="myAttr"> some text </tag2> </tag1>
所以我基本上需要正则expression式来find任何开始标签和添加我的属性,但我是一个完整的正则expression式noob。
不要使用正则expression式来处理xml。 Xml不是一个正规的语言。 使用PHP的XML扩展代替:
$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();
所有包含正则expression式的答案都会打破这个有效的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>
$xml_data = preg_replace("/<([^\/]+\w+)/", "<\\1 attr=\"myAttr\">", $xml_data);
好的,对于那些阅读这些行,并仍然有兴趣使用正则expression式出于某种原因,这里是如何做到这一点:
$xml_data= preg_replace('/(<[A-Za-z0-9\-\_]+[^>]*)>/u','\1 attr="myAttr">',$xmlData);
但是,正如前面所讨论的那样,谨慎使用那个! 仅在XML源代码中使用它,您不会被破坏(请参阅soulmerge文章)