除了文章中的网站链接外,我想替换所有外部URL。这样,到外部站点的原始链接将被加密/屏蔽/重写。
例如:
原始链接:www.google.com 将其重写为:www.mydomain.com/goto/google.com
我尝试了DOMDocument,但出现错误:
警告:DOMDocument :: loadHTML():在实体中重新定义属性目标,行: [...] [...] 在行 20
我尝试过
<?php
$html ='1224 <a href="http://www.google.com">google</a> 567';
$tracking_string = 'http://example.com/goto/';
$html = preg_replace('#(<a[^>]+href=")(http|https)([^>" ]+)("?[^>]*>)#is','\\1'.$tracking_string.'\\2\\3\\4',$html);
echo $html;
它将替换所有链接,包括我的网站链接
答案 0 :(得分:0)
我对RegEx不太了解,但是经过一番搜索之后,您似乎只需要一个Negative Lookahead。
正则表达式:#(?!.+(\bgoogle.com\b))(<a[^>]+href=")(http|https)([^>" ]+)("?[^>]*>)#is
<?php
$html = '1224 <a href="http://www.google.com">google</a> 567';
$tracking_string = 'http://example.com/track.php?url=';
$html = preg_replace('#(?!.+(\bgoogle.com\b))(<a[^>]+href=")(http|https)([^>" ]+)("?[^>]*>)#is', '\\2'. $tracking_string.'\\3\\4\\5',$html);
echo $html;
?>
将prem_replace中的 google.com 替换为您的域,并且可以正常工作。
演示:https://regex101.com/r/kIxMYf/1
编辑:请注意,preg_replace
可能不是您想要的。在检查了具有多个实例的代码后,它不会替换所有匹配项,而只会替换最后一个实例。就表达式的逻辑而言,它适用于多个实例。在RegExr和RegEx101上进行演示。