PHP如何替换文章里面的外部链接

时间:2019-07-19 15:50:11

标签: php regex

除了文章中的网站链接外,我想替换所有外部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; 

它将替换所有链接,包括我的网站链接

1 个答案:

答案 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可能不是您想要的。在检查了具有多个实例的代码后,它不会替换所有匹配项,而只会替换最后一个实例。就表达式的逻辑而言,它适用于多个实例。在RegExrRegEx101上进行演示。