繁体   English   中英

内容网址正则表达式

[英]content URLs regexp

我从db收到了一个代码块,该代码块偶尔包含url,例如, 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停止符”,但也可以URL中包含的内容。 我的第一个猜测是:

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

将被替换为

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

但这是行不通的,因为第二个变量容器是可选的,所以最好将那些字符包含在第一个变量中,因为在那里除了空格字符之外都可以进行其他操作。

非常感谢您的帮助,但老实说,我不希望在互联网上找到一条巨大的规则,目前看来这条规则行之有效。 我敢肯定,有一种很酷的方法可以做到这一点。 我对正则表达式有一个不错的了解,但是这种情况似乎是我以前从未经历过的。 或者,也许我错过了一些东西,毕竟是凌晨3点。

谢谢!

编辑:

@Chirael帮我解决了,但这是我的最终解决方案:

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

打滑,加一个? 在[^ \\ 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.

那样有用吗?

您也可以尝试另一种方法:您可以指定可接受的最后一个字符,而不是在URL末尾列出不需要的内容。 在此示例中:

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

我要在末尾要求一个非空格序列和一个字母数字字符(加斜杠)(通常是有效URL的结尾方式)。

还有一些注意事项:

  • 在PHP中(如Perl),您可以选择模式定界符, / /仅是常规的,但您可以选择(几乎)任何您喜欢的字符:选择正确的定界符可避免大量转义
  • 最好将单个字符的交替写成一个字符类: [,.;:](\\,|\\.|\\;|\\:)更容易阅读(\\,|\\.|\\;|\\:)后者也包含不必要的转义(只有点需要它)
  • 了解哪些内容需要转义,哪些不需要转义,用反斜杠填充模式将使其变得不可读

您可以尝试以下方法:

正则表达式:

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

替代:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM