У меня есть хорошо сформированные 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, который, как вы знаете, не будет нарушен (см. Сообщение о том, как это произошло )