我有一个这样的字符串:
Google is a <a href="http://hi.hi?xxx&yyy&zzz">web&search engine</a>.
我希望仅在链接中将&
替换为&
,根据W3C验证器的需要:
Google is a <a href="http://hi.hi?xxx&yyy&zzz">web&search engine</a>.
你能建议一个正则表达式吗?谢谢!
答案 0 :(得分:1)
官方正确的答案是你不应该使用正则表达式来解析HTML。相反,看看HTML解析库。这个问题涵盖了您的选择:
How do you parse and process HTML/XML in PHP?
我建议采用这种方法。使用DOM之类的工具解析HTML后,您可以使用简单的正则表达式在链接中执行替换。如果你遇到麻烦,人们会很乐意提供帮助。
如果您确实坚持使用正则表达式(并且在HTML内容受您控制的某些有限情况下可以正常)只搜索此站点,您会发现大量问题,其中人们展示如何这样做。
答案 1 :(得分:1)
正如dan1111所指出的那样,正则数据最多只是一个脆弱的工具。接下来的问题是你需要可变长度的lookbehind断言来达到某种程度的可靠性,让我感到舒服。
也就是说,以下情况可能适合您 - 尝试一下您之前备份的一些数据:
$result = preg_replace('/&(?=[^<>]*>)/', '&', $subject);
仅当下一个尖括号是结束尖括号时,才会替换&
。
答案 2 :(得分:0)
你可以使用前瞻和后视。
&(?<=\<a\s(href).*)(?=.*\"\>)
这样做的目的是查找前面带有&
的所有< href
和任何字符,以及后面跟">
和{}的所有字符。当我在RegexHero上进行测试时,它只选择了链接中的&
。