正则表达式在任何 xml 标记中添加属性
Posted
技术标签:
【中文标题】正则表达式在任何 xml 标记中添加属性【英文标题】:Regexp to add attribute in any xml tags 【发布时间】:2010-11-24 08:22:09 【问题描述】:我已将格式良好的 xml 文档转换为字符串变量。我想使用 preg_replace 为每个 xml 标签添加定义的属性。
例如替换:
<tag1>
<tag2> some text </tag2>
</tag1>
作者:
<tag1 attr="myAttr">
<tag2 attr="myAttr"> some text </tag2>
</tag1>
所以我基本上需要正则表达式来查找任何开始标签并添加我的属性,但我是一个完整的正则表达式菜鸟。
【问题讨论】:
【参考方案1】:不要使用正则表达式来处理 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>
【讨论】:
我理解将正则表达式用于 xml 的肮脏,但在我的情况下,我只会尝试在“正则表达式安全”xml 文档中添加这些属性。感谢您指出这一点! 顺便说一句,我对使用 simpleXML 所需的少量代码感到惊讶,我尝试了您的代码,但它在文档的结束标记之前添加了一个 元素,很奇怪 好的,我做了一些小的改动来为我工作,使用 addAttribute($name,$value) 而不是 attributes[] 并且在 foreach 语句中 $xmlNode->children() 需要括号.再次感谢!【参考方案2】:$xml_data = preg_replace("/<([^\/]+\w+)/", "<\\1 attr=\"myAttr\">", $xml_data);
【讨论】:
arrrg 它几乎可以解决问题,除了这会在每个节点的 CDATA 部分添加 'attr="myAttr">',但不是作为属性...任何想法? 是的,这就是为什么人们建议不要混合正则表达式和 XML,因为极端情况和等效语法。不过不用担心,您只会在绝对 100% 合法且一致的 XML 上使用它,对吧?【参考方案3】:好的,对于那些阅读这些行并且由于某些原因仍然对使用正则表达式方式感兴趣的人,这里是如何做到的:
$xml_data= preg_replace('/(<[A-Za-z0-9\-\_]+[^>]*)>/u','\1 attr="myAttr">',$xmlData);
但是,如前所述,请谨慎使用它! 仅在您知道不会被破坏的 XML 源上使用它(请参阅soulmerge 帖子)
【讨论】:
以上是关于正则表达式在任何 xml 标记中添加属性的主要内容,如果未能解决你的问题,请参考以下文章
匹配 XML 字符串的正则表达式在 C# 中具有开始和结束标记
在 Python 中使用正则表达式从特定 xml 标记中提取特定值 [重复]