【问题标题】:Regex for external links: how to make an exception for my own link?外部链接的正则表达式:如何为我自己的链接设置例外?
【发布时间】:2013-07-24 01:11:18
【问题描述】:

如果文本前有http://,我正在使用regex 将纯文本更改为url。这工作正常,但如果这个链接是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;
}

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

【问题讨论】:

  • 您可以尝试各种不同的技术。这是一个很好的链接,用 jQuery css-tricks.com/snippets/jquery/target-only-external-links 说明了这些,看起来你对技术#3 很感兴趣
  • 谢谢,但这是一个 Wordpress 网站,我使用的是 PHP,而不是 jQuery。
  • WordPress 使用 jQuery 和 PHP,所以我不知道你说的“不使用”jQuery 是什么意思
  • 对不起,我知道,但我的意思是它不是一个函数,我可以把它放在functions.php 中并直接使用它。
  • 好吧,如果你放弃 functions.php 的做法,有一些不错的 jQuery 可以用 Regex 完全相同的方式处理这个问题。一切顺利,我会回来看看你是否找到了一种使用纯 PHP 的方法(我也确信这很有可能)

标签: php regex wordpress


【解决方案1】:

您应该能够使用以下内容:

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

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

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

在下面使用它将匹配除http://www.google.co.uk之外的所有URL...

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.

上述正则表达式还将匹配带有 GET 附加字符串和内部链接(即 #)的 youtube 视频等

更新

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

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

【讨论】:

  • 你能给我一个链接和外部链接的例子吗?
  • 好吧,我的链接是http://mydomain.com,外部链接可以是http://externalink.comhttp:// www.externalink.com
  • 查看我的编辑。我在我的内部链接中添加了类。我可以用它来区分它们吗?
  • 好的,在这种情况下,我不确定您的意思是什么?您说该功能正在处理纯文本?纯文本不能有类或标记,否则它不是纯文本?!也许您可以复制/粘贴您的其他功能以及两者都在处理的纯文本。
  • 好吧,对于纯文本,我的意思是一个实际上不是链接的锚点,但它有一个类。抱歉这么说,我想简单...这个功能的问题是我仍然无法排除网站。它仍然影响我自己的链接。
【解决方案2】:

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

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

* 这意味着我没有花时间在一个 url 模式上,如果你找到更好的模式,就改变它。这只是为了说明如何排除您的域。

【讨论】:

  • 不要忘记 https 链接的可能性 ;)
  • 谢谢,但它不起作用。存在同样的问题......也许是因为我不使用 www 而是使用 mydomain.com 代替?为什么这不起作用?
  • 答案是一个很好的提示,你必须做什么。请阅读正则表达式手册以了解您必须更改的内容...
  • 我知道我必须改变什么,这不是问题。问题是它仍然可以获取我的内部链接!
  • @MichaelWalter 查看我的编辑。我在我的内部链接中添加了类。我可以用它来区分它们吗?
猜你喜欢
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 1970-01-01
  • 2017-04-05
  • 2012-06-08
  • 1970-01-01
  • 2011-04-12
相关资源
最近更新 更多