preg_replace file_get_contents 中不包含单词的所有链接

use*_*487 5 php regex preg-replace regex-lookarounds

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

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

- 解决方案 -

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

Mat*_*bon 3

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

对于这个问题,您做错了什么:正则表达式尽可能匹配,并且对于每个网址(甚至包含remedy),都可以匹配'~<a href=".*?(?!remedy).*?".*?>(.*?)</a>~i',因为您没有指定remedy可能不包含在属性中的任何位置,但您指定必须有任何内容/nothing( .*?) 后面没有跟随remedy任何 url,除了那些完全以 开头的 url 都是这种情况<a href="remedy"。希望大家能够理解这一点...