仅在链接中替换模式

时间:2012-09-27 14:42:05

标签: php regex html-parsing preg-replace w3c-validation

我有一个这样的字符串:

Google is a <a href="http://hi.hi?xxx&yyy&zzz">web&amp;search engine</a>.

我希望仅在链接中将&替换为&amp;,根据W3C验证器的需要:

Google is a <a href="http://hi.hi?xxx&amp;yyy&amp;zzz">web&amp;search engine</a>.

你能建议一个正则表达式吗?谢谢!

3 个答案:

答案 0 :(得分:1)

官方正确的答案是你不应该使用正则表达式来解析HTML。相反,看看HTML解析库。这个问题涵盖了您的选择:

How do you parse and process HTML/XML in PHP?

我建议采用这种方法。使用DOM之类的工具解析HTML后,您可以使用简单的正则表达式在链接中执行替换。如果你遇到麻烦,人们会很乐意提供帮助。

如果您确实坚持使用正则表达式(并且在HTML内容受您控制的某些有限情况下可以正常)只搜索此站点,您会发现大量问题,其中人们展示如何这样做。

答案 1 :(得分:1)

正如dan1111所指出的那样,正则数据最多只是一个脆弱的工具。接下来的问题是你需要可变长度的lookbehind断言来达到某种程度的可靠性,让我感到舒服。

也就是说,以下情况可能适合您 - 尝试一下您之前备份的一些数据:

$result = preg_replace('/&(?=[^<>]*>)/', '&amp;', $subject);

仅当下一个尖括号是结束尖括号时,才会替换&

答案 2 :(得分:0)

你可以使用前瞻和后视。

&(?<=\<a\s(href).*)(?=.*\"\>)

这样做的目的是查找前面带有&的所有< href和任何字符,以及后面跟">和{}的所有字符。当我在RegexHero上进行测试时,它只选择了链接中的&