正则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文章)