我有一个这样的字符串:
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>.
你能为此建议一个正则表达式吗?谢谢!
我有一个这样的字符串:
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>.
你能为此建议一个正则表达式吗?谢谢!
官方的正确答案是你不应该使用正则表达式来解析 HTML。相反,请查看 HTML 解析库。这个问题涵盖了您的选择:
我建议采用这种方法。使用 DOM 之类的工具解析 HTML 后,您可以使用简单的正则表达式在链接中执行替换。如果您遇到困难,人们会很乐意提供帮助。
如果您确实坚持为此使用正则表达式(并且在 HTML 内容受您控制的某些有限情况下也可以),只需搜索此站点,您会发现大量问题,人们会在其中展示如何执行此操作。
正如 dan1111 所指出的,正则表达式充其量只是一个脆弱的工具。下一个问题是,您需要可变长度的后视断言来获得某种程度的可靠性,这让我感觉很舒服。
也就是说,很可能以下内容对您来说足够好 - 尝试使用您之前备份的一些数据:
$result = preg_replace('/&(?=[^<>]*>)/', '&', $subject);
&
仅当下一个尖括号是闭合尖括号时才替换 an 。
您可以使用前瞻和后瞻。
&(?<=\<a\s(href).*)(?=.*\"\>)
它的作用是查找所有&
前面的< href
和任何字符,以及后面跟着一个">
和的任何字符。当我在RegexHero上进行测试时,它只选择&
了链接本身。