我知道有很多问题要求帮助将 URL 转换为字符串中的可点击链接,但我还没有找到我正在寻找的东西。
我希望能够匹配以下任何示例并将它们变成可点击的链接:
http://www.domain.com
https://www.domain.net
http://subdomain.domain.org
www.domain.com/folder
subdomain.domain.net
subdomain.domain.edu/folder/subfolder
domain.net
domain.com/folder
我不想匹配 random.stuff.separated.with.periods。
编辑:请记住,这些 URL 需要在较大的“普通”文本字符串中找到。例如,我想在“Hello!Come check out domain.net!”中匹配“domain.net”。
我认为这可以通过一个正则表达式来完成,该表达式可以确定匹配的 url 是否包含 .com、.net、.org 或 .edu,后跟正斜杠或空格。除了用户拼写错误之外,我无法想象在任何其他情况下,一个有效的 URL 会包含其中一个,然后是其他任何内容。
我意识到那里有许多有效的域扩展,但我不需要全部支持。我可以在正则表达式中选择支持 (com|net|org|edu) 之类的内容。不幸的是,我对正则表达式还不够熟练,还不知道如何正确实现这一点。
我希望有人可以帮助我找到一个正则表达式(用于 PHP 的 preg_replace),它可以根据几乎任何由一个或多个点连接的文本匹配 URL,并且以指定扩展名之一结尾,后跟空格或包含一个指定的扩展名后跟一个斜杠和可能的文件夹。
我做了几次搜索,到目前为止还没有找到我要找的东西。如果已经存在回答此问题的 SO 帖子,我深表歉意。
提前致谢。
--- 编辑 3 ---
经过几天的反复试验和 SO 的一些帮助,以下是有效的方法:
preg_replace_callback('#(\s|^)((https?://)?(\w|-)+(\.(\w+|-)*)+(?<=\.net|org|edu|com|cc|br|jp|dk|gs|de)(\:[0-9]+)?(?:/[^\s]*)?)(?=\s|\b)#is',
create_function('$m', 'if (!preg_match("#^(https?://)#", $m[2]))
return $m[1]."<a href=\"http://".$m[2]."\">".$m[2]."</a>"; else return $m[1]."<a href=\"".$m[2]."\">".$m[2]."</a>";'),
$event_desc);
这是下面 anubhava 代码的修改版本,到目前为止似乎完全符合我的要求。谢谢!