[英]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|$)
打滑,加一个? 在[^ \\ 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的结尾方式)。
还有一些注意事项:
/ /
仅是常规的,但您可以选择(几乎)任何您喜欢的字符:选择正确的定界符可避免大量转义 [,.;:]
比(\\,|\\.|\\;|\\:)
更容易阅读(\\,|\\.|\\;|\\:)
后者也包含不必要的转义(只有点需要它) 您可以尝试以下方法:
正则表达式:
(http?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)
替代:
<a href="$1">$1</a>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.