Regexp для добавления атрибута в любые теги xml

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

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

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

от:

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

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

Не используйте регулярные выражения для работы с 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> 
 $xml_data = preg_replace("/<([^\/]+\w+)/", "<\\1 attr=\"myAttr\">", $xml_data); 

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

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

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