0

我有一个这样的字符串:

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

根据 W3C 验证器的需要,我只想在链接&中替换:&amp;

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

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

4

3 回答 3

1

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

您如何在 PHP 中解析和处理 HTML/XML?

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

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

于 2012-09-27T14:55:56.483 回答
1

正如 dan1111 所指出的,正则表达式充其量只是一个脆弱的工具。下一个问题是,您需要可变长度的后视断言来获得某种程度的可靠性,这让我感觉很舒服。

也就是说,很可能以下内容对您来说足够好 - 尝试使用您之前备份的一些数据:

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

&仅当下一个尖括号是闭合尖括号时才替换 an 。

于 2012-09-28T05:51:45.243 回答
0

您可以使用前瞻和后瞻。

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

它的作用是查找所有&前面的< href和任何字符,以及后面跟着一个">和的任何字符。当我在RegexHero上进行测试时,它只选择&了链接本身。

于 2012-09-27T15:01:05.427 回答