PHP正则表达式:排除href锚标记

flo*_*eft 6 php regex preg-replace

我正在创建一个简单的搜索我的应用程序.

我正在使用PHP正则表达式替换(preg_replace)来查找搜索词(不区分大小写)并<strong>在搜索词周围添加标签.

preg_replace('/'.$query.'/i', '<strong>$0</strong>', $content);

现在我对正则表达式不是最好的.那么我将添加到正则表达式中以不替换href锚标记中的搜索项?

如果有人搜索"信息",它不会改变到"http://something.com/this_这样<strong>的信息</strong>/index.htm"明明

anu*_*ava 1

我相信您将需要条件子模式]为此目的:

$query = "link";
$query = preg_quote($query, '/');

$p = '/((<)(?(2)[^>]*>)(?:.*?))*?(' . $query . ')/smi';
$r = "$1<strong>$3</strong>";

$str = '<a href="/Link/foo/the_link.htm">'."\n".'A Link</a>'; // multi-line text
$nstr = preg_replace($p, $r,  $str);
var_dump( $nstr );

$str = 'Its not a Link'; // non-link text
$nstr = preg_replace($p, $r,  $str);
var_dump( $nstr );
Run Code Online (Sandbox Code Playgroud)

输出:(查看源代码)

string(61) "<a href="/Link/foo/the_link.htm"> 
A <strong>Link</strong></a>"
string(31) "Its not a <strong>Link</strong>"
Run Code Online (Sandbox Code Playgroud)

PS:上面的正则表达式还负责多行替换,更重要的是,它不仅忽略匹配<href,还忽略匹配和中包含的任何其他 HTML 实体>

编辑:如果您只想排除hrefs而不是所有 html 实体,则在我的答案中使用此模式而不是上面的模式:

$p = '/((<)(?(2).*?href=[^>]*>)(?:.*?))*?(' . $query . ')/smi';
Run Code Online (Sandbox Code Playgroud)