我从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|$)
答案 0 :(得分:2)
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);
我要求一系列非空格和一个字母数字字符(加上斜线)(通常是有效网址的结尾)。
还有几点说明:
/ /
只是传统的但你可以选择(几乎)你喜欢的任何字符:选择正确的分隔符可以避免大量的转义[,.;:]
比(\,|\.|\;|\:)
更容易阅读,其中还包括不必要的转义(只有点需要它)答案 2 :(得分:0)
你可以试试这个:
正则表达式:
(http?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)
的更换:
<a href="$1">$1</a>