外部链接的正则表达式:如何为我自己的链接制作例外?

时间:2013-07-24 13:53:02

标签: php regex wordpress

如果文本前面有regex,我正在使用http://将纯文本更改为网址。这工作正常,但我不想让它们成为链接,如果此链接是internal(所以包含我的网站名称的链接)... 所以我只希望它发生如果它是外部链接。

我该怎么做?我尝试在http之前添加!,但它没有用。有人可以帮帮我吗?这就是我正在使用的:

function wpse107488_urls_to_links( $string ) {

   $string = preg_replace( "/([^\w\/])(www\.[a-z0-9\-]+\.[a-z0-9\-]+)/i", "$1http://$2", $string );

    $string = preg_replace( "/([\w]+:\/\/[\w-?&;%#~=\.\/\@]+[\w\/])/i", "<a target=\"_blank\" title=\"" . __( 'Visit Site', 'your-textdomain' ) . "\" href=\"$1\">$1</a>", $string);

    return $string;
}

编辑:我正在使用一个不同的函数,它也可以从我的内部链接建立一个链接(应该是这样),但我认为这两个函数相互阻塞。这就是我为所有内部链接提供课程的原因。我可以使用这些类排除它们吗?

2 个答案:

答案 0 :(得分:3)

您应该可以使用以下内容:

/((http|https):\/\/(?!www.google.co.uk)[\w\.\/\-=?#]+)/ http https

/(http:\/\/(?!www.google.co.uk)[\w\.\/\-=?#]+)/仅限 http

然后,您可以将www.google.co.uk替换为您的域名(使用您网站上显示的格式)。

在下面使用它将匹配除http://www.google.co.uk ...

以外的所有网址
A few websites to test the regex http://www.google.co.uk http://www.myspace.com http://facebook.com http://www.youtube.com/watch?v=video32 it should have matched all but the google URL.

以上正则表达式还会匹配youtube视频等,附加GET个字符串和内部链接(即#

<强>更新

以下正则表达式将使用锚标记将http://www的所有外部链接替换为新窗口/标签中的URL开头。

$string = preg_replace( "/((http:\/\/|www)(?!mydomain\.com)[\w\.\/\-=?#]+)/", "<a target='_blank\' href='$1'>$1</a>", $string);

答案 1 :(得分:0)

您可以使用您的域名添加否定前瞻(?!..) (未跟随),这是一个超级通用模式*中的示例来检测网址:

$string = preg_replace('~\bhttps?://(?:www\.)?(?!mydomain.com)[^\s/]+(?:/[^\s/]+)*/?~i',
                       '<a href="$0">$0</a>', $string );

*这意味着我没有花时间去网址模式,如果找到更好的模式,请更改它。它仅用于说明如何排除您的域名。