内容网址正则表达式

时间:2009-11-25 01:28:28

标签: regex url

我从db收到一段代码,偶尔会包含网址,例如http://site.tld/lorem.ipsum/whatever 现在我想通过一个帮助方法将其转换为用户的可点击链接。如:

<a href="http://site.tld/lorem.ipsum/whatever">http://site.tld/lorem.ipsum/whatever</a>

当然,任何人都可以这样做,[^\s]+可以解决问题。但显而易见的问题是,如果我有一个点(。),就在URL之后,我不希望它包含在链接中。所以我们需要将URL限制为多个字符,但是我们不能创建一个匹配不是特定字符的字符的规则,因为我之前提到过的点是“url stop”但它也可以是包含在URL中。 我的第一个猜测:

(http\:\/\/[^\s]+)(\,|\.|\;|\:)?

将替换为

<a href="$1">$1</a>$2

但是它不起作用,因为第二个变量容器是可选的,似乎最好将这些字符包含在第一个容器中,因为除了空格字符之外的任何东西都允许。

我真的很感谢你的帮助,但老实说,我不希望在互联网上找到一个巨大的规则,这似乎在目前有效。我确信有一个很酷的方法来获得这个。我对正则表达式有一个很好的理解,但这种情况似乎是我之前没有经历过的。或者也许我错过了一些东西,毕竟它已经过了凌晨3点。

谢谢!

编辑:

@Chirael为我清楚,但这是我的最终解决方案:

(http\:\/\/[^\s]+?)(\,|\.|\;|\:)?(\s|$)
  1. 我正在清除斜杠,因为我正在使用PHP
  2. 我在第二个变量
  3. 中添加了更多字符作为“URL stoppers”
  4. 由于第一个变量变为“非贪婪”,第二个变量是可选的,如果未指定第三个变量,则链接将仅包含“http://”之后的第一个变量。但是当URL是文本中的最后一个东西时出现了问题,所以现在第3个变量可以是空格字符或文本的结尾。

3 个答案:

答案 0 :(得分:2)

打滑,加一个?在[^ \ s] +之后使其变得非贪婪,然后是一个“可选”期间? - 我在文件中使用了以下示例文本:

Lorem I receive a block of code from db which occasionally contains
urls, e.g, http://site.tld/lorem.ipsum/whatever and
http://site.tld/lorem.ipsum/whatevertwo. Now I want to turn this into
nice clickable link for the user, with a helper method. Such as.

然后在命令行上运行以下代码,它似乎满足您的要求:

perl -pe 's#(http://[^\s]+?)(\.?)(\s)#<a href="$1">$1</a>$2$3#g' foo.txt

...导致:

Lorem I receive a block of code from db which occasionally contains
urls, e.g, <a href="http://site.tld/lorem.ipsum/whatever">http://site.tld/lorem.ipsum/whatever</a> and
<a href="http://site.tld/lorem.ipsum/whatevertwo">http://site.tld/lorem.ipsum/whatevertwo</a>. Now I want to turn this into
nice clickable link for the user, with a helper method. Such as.

这有用吗?

答案 1 :(得分:1)

您还可以尝试不同的方法:您可以指定可接受的最后一个字符,而不是列出您想要包含在网址末尾的内容。在这个例子中:

$str = preg_replace('#(http://\S+[a-z0-9/])#', '<a href="\1">\1</a>', $str);

我要求一系列非空格和一个字母数字字符(加上斜线)(通常是有效网址的结尾)。

还有几点说明:

  • 在PHP中(如在Perl中)你可以选择你的模式分隔符,/ /只是传统的但你可以选择(几乎)你喜欢的任何字符:选择正确的分隔符可以避免大量的转义
  • 单个字符的交替更好地写为字符类:[,.;:](\,|\.|\;|\:)更容易阅读,其中还包括不必要的转义(只有点需要它)
  • 了解需要转义的内容以及不需要转义的内容,使用反斜杠填充图案会使其无法读取

答案 2 :(得分:0)

你可以试试这个:

正则表达式:

(http?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)

的更换:

<a href="$1">$1</a>