5

我正在将一个页面读入一个变量,我想禁用地址中不包含“补救”一词的所有链接。到目前为止,我拥有的代码获取了所有链接,包括带有“补救措施”的链接。我究竟做错了什么?

$page = preg_replace('~<a href=".*?(?!remedy).*?".*?>(.*?)</a>~i', '<font color="#808080">$1</font>', $page);

- 解决方案 -

$page = preg_replace('~<a href="(.(?!remedy))*?".*?>(.*?)</a>~i', '<font color="#808080">$2</font>', $page);
4

2 回答 2

3

尝试~<a href="(.(?!remedy))*?".*?>(.*?)</a>~i

对于这个问题,你做错了什么:正则表达式匹配,如果可能的话,并且对于每个 url(甚至包含remedy),它都可以匹配'~<a href=".*?(?!remedy).*?".*?>(.*?)</a>~i',因为你没有指定remedy可能不包含在属性中的任何地方,但你指定必须有任何东西/nothing( .*?) 后面没有remedy,任何 url 都是这种情况,除非以完全 . 开头<a href="remedy"。希望大家能理解...

于 2013-05-12T21:50:56.853 回答
1

我可能会使用这个:

<a href="(?:(?!remedy)[^"])*"[^>]*>([^<]*)</a>

最有趣的部分是:

"(?:(?!remedy)[^"])*"

每次 the[^"]即将使用另一个字符时,它都会让位于前瞻,因此它确认它不是 word 的第一个字符remedy。使用[^"]而不是.防止它查看结束引号之外的任何内容。我还冒昧地将您.*?的 s 替换为否定字符类。这具有相同的目的,将匹配“圈在”您希望匹配的区域中。它也更高效、更健壮。

当然,我假设<a>元素的内容是纯文本,其中没有嵌套更多元素。事实上,这只是我所做的许多简化假设之一。没有它们,您无法将 HTML 与正则表达式匹配。

于 2013-05-12T23:27:08.390 回答