将target = _blank添加到外部链接

时间:2015-04-09 14:01:51

标签: php regex

我想将target="_blank"添加到<a>标记以在新页面中打开该链接,因此我找到了此RegEx:

$content = preg_replace('/(<a href[^<>]+)>/is', '\\1 target="_blank">', $content);

此操作没有任何问题,但此代码会将target="_blank"添加到所有链接,我只想添加href将以http://开头的链接

我该怎么做?

2 个答案:

答案 0 :(得分:3)

您已在此处要求提供正则表达式,但该作业并非tool

$doc = new DOMDocument;
$doc->loadHTML($html); // Load your HTML

$xpath = new DOMXPath($doc);
$links = $xpath->query('//a[starts-with(@href, "http://")]');

foreach($links as $link) { 
   $link->setAttribute('target', '_blank');
}

echo $doc->saveHTML();

如果您想按照评论中的建议排除内部链接,可以执行以下操作:

$links = $xpath->query('//a[starts-with(@href, "http://") and 
                        not(starts-with(@href, "http://yoursite.com")) and
                        not(starts-with(@href, "http://www.yoursite.com))]');

答案 1 :(得分:0)

您可以使用此正则表达式:

(<a\b[^<>]*href=['"]?http[^<>]+)>

请参阅demo

我已添加\b[^<>]*以考虑href之前的任何其他属性。

示例代码:

$re = "/(<a\\b[^<>]*href=['\"]?http[^<>]+)>/is"; 
$str = "<a href=\"do.com\">\n<a href=\"do.com\">\n<a another=\"val\" href=\"http://do.com\">\n"; 
$subst = "$1 target=\"_blank\">"; 
$result = preg_replace($re, $subst, $str);