【发布时间】:2011-03-31 15:35:26
【问题描述】:
我正在编写一个正则表达式查找/替换,它将在 <span> 尚不存在的文件中的每个 <a href> 中插入一个 <span>。它将允许其他标签位于<a href> 中,例如<img>、<b> 等。
目前我有这个正则表达式:
查找:(<a[^>]+?style=".*?color:#(\w{6}).*?".*?>)(.+?)(<\/a>)
替换:'$1<span style="color:#$2;">$3</span>$4'
它工作得很好,除非我在同一个文件上运行它,它会在 <span> 内插入一个 <span> 并且它会变得混乱。
目标示例:
我们希望它忽略这个:<a href="http://mywebiste.com/link1.html" target="_blank" style="color:#bfbcba; text-decoration:underline;"><span style="color:#bfbcba;">Howdy</span></a>
但不是这个:<a href="http://mywebiste.com/link1.html" target="_blank" style="color:#bfbcba; text-decoration:underline;">Howdy</a>
或者这个:<a href="http://mywebiste.com/link1.html" target="_blank" style="color:#bfbcba; text-decoration:underline;"><img src="myimg.gif" />Howdy</a>
--编辑--
使用 cmets 中建议的 PHP DOM 库,这是我目前所拥有的:
$doc = new DOMDocument();
$doc->loadHTML($input);
$tags = $doc->getElementsByTagName('a');
foreach ($tags as $tag) {
$spancount = $tag->getElementsByTagName("span")->length;
if($spancount == 0){
$element = $doc->createElement('span');
$tag->appendChild($element);
}
}
echo $doc->saveHTML();`
目前它会检测锚内部是否有跨度,如果有,它将在锚内部附加一个跨度,但是,我还没有弄清楚如何获取锚内部的原始内容跨度。
【问题讨论】:
-
用什么语言?可能是 Perl、PHP 或 Javascript?
-
不要使用正则表达式来匹配 HTML。使用 HTML 解析器。
-
使用正则表达式解析 XML (HTML) 是个坏主意。使用 HTML 解析器。
-
这完美回答了你的问题:stackoverflow.com/a/1732454/13365