PHP/RegEx-通过检测.com/.net/.org/.edu等将URL转换为链接

PHP/RegEx-通过检测.com/.net/.org/.edu等将URL转换为链接,php,regex,url,hyperlink,Php,Regex,Url,Hyperlink,我知道有很多问题需要帮助将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/f

我知道有很多问题需要帮助将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!来签出domain.net!”中匹配“domain.net”

我认为这可以通过一个正则表达式来实现,该正则表达式可以确定匹配的url是否包含.com、.net、.org或.edu,后跟正斜杠或空格。除了用户输入错误之外,我无法想象在任何其他情况下,一个有效的URL后面会有一个这样的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);

preg\u replace\u回调('.#(\s|^)((https?:/)(\w|-)+(\.(\w++)*)+(?您可以使用此正则表达式:

#(\s|^)((?:https?://)?\w+(?:\.\w+)+(?<=\.(net|org|edu|com))(?:/[^\s]*|))(?=\s|\b)#is
#(\s|^)((?:https?:/)?\w+(?:\。\w+)(?
这适用于您的示例。您可能希望在最后一个括号中添加对“-”、“&”、“?”和“:”等的额外字符支持

'/(http(s)?:\/\/)?[\w\/\.]+(\.((com)|(edu)|(net)|(org)))[\w\/\?=&-;]*/'
这将支持参数和端口号


例如:www.foo.ca:8888/test?param1=val1¶m2=val2

非常感谢。我修改了他的最终解决方案,允许所有域(.ca,.co.uk),而不仅仅是指定的域

$html = preg_replace_callback('#(\s|^)((https?://)?(\w|-)+(\.[a-z]{2,3})+(\:[0-9]+)?(?:/[^\s]*)?)(?=\s|\b)#is',
    create_function('$m', 'if (!preg_match("#^(https?://)#", $m[2])) return $m[1]."<a href=\"http://".$m[2]."\" target=\"blank\">".$m[2]."</a>"; else return $m[1]."<a href=\"".$m[2]."\" target=\"blank\">".$m[2]."</a>";'),
    $url);
$html=preg\u replace\u回调('#(\s|^)((https?:/)(\w |-)+(\.[a-z]{2,3})+(\:[0-9]+)(?:/[^\s]*)(?=\s |\b)\.\is',
创建函数('$m',如果(!preg_match(#^(https?:/)#“,$m[2])返回$m[1]。”;否则返回$m[1]。”),
$url);

谢谢。遗憾的是,这根本检测不到URL。请记住,URL需要在普通文本块中找到。例如,我需要在类似“您好!在域.net上查看我的站点!”的内容中匹配“域.net”从你的例子中可以看出,你只是有一个URL列表。不管怎样,现在很清楚,我只是编辑了一下,请现在检查我的答案。谢谢。你的新正则表达式更接近,除了有两个问题。没有http://的URL被转换为相对链接,因此,例如,某物的URL.domain.net将变成如下链接(假设我的页面托管在“www.vertigofx.com”上),而不是它自己的绝对链接。此外,当它将URL与文件夹路径匹配时,后面还包含一些其他内容。好的,我根据您的评论再次编辑了我的答案,请现在检查。我发现了一个冲突问题。我使用的是nl2br()在进行preg_replace之前,因此在行的末尾有
标记,通常直接位于URL之后。我修复了这个问题,并且您的正则表达式工作得更好,但仍然不理想。如果我键入“welcome.to.computers”,它将匹配“welcome.to.com”不应该。我意识到不太可能有人会键入正确的点和字母组合来创建错误的URL,但必须有一种方法来修复它。你能让它以空格或正斜杠结尾以匹配吗?谢谢你的帮助。我尝试了你的第二个示例,得到了关于未知修改器的PHP警告“?”在preg|u replace中,然后尝试“/(http(s)?:\/\/)?[\w\/\]+(\((com)(edu)(net)(org))[\w\/\?=&-;]*/“这几乎可以完美地工作!谢谢。现在唯一的问题是我使用anubhava的解决方案时遇到的问题之一。开始时没有“http://”的URL将作为相对链接出现。当然,我可能会测试是否有,如果没有,则添加它。我想这样就可以了。如果出现任何问题,我会通知您。”up.EDIT:Ah,刚刚发现一个问题。正则表达式匹配了一个以.edue结尾的字符串,但它不应该匹配。如何修改正则表达式,使其要求扩展名后面紧跟空格或斜杠?我使用preg_replace_callback()包含了一个添加了“http://”的函数现在我只需要你的正则表达式帮我匹配URL和那些扩展名,只要扩展名后面有空格或斜杠(防止匹配像“Hello.Come-visit-oursite.Com!”/(http(s)?:\/\/)?[\w\/\.]+((Com)(edu)(net)(org))[^\w.]{1}[\w\/\=&-]*/'应该阻止“edue”。对于最后一个字符,我想您可以验证一下。我对正则表达式不太在行。您是如何确定有效域名的结尾和键入错误句子的结尾/开头之间的差异的?例如,“subdomain.domain.ca”和“嘿,你好,你能读懂这个吗?”我的答案是:
'/(http(s)?:\/\/)?[\w\/\.]+(\.((com)|(edu)|(net)|(org)))[\w\/]*/'
'/(http(s)?:\/\/)?[\w\/\.]+(\.((com)|(edu)|(net)|(org)))[\w\/\?=&-;]*/'
$html = preg_replace_callback('#(\s|^)((https?://)?(\w|-)+(\.[a-z]{2,3})+(\:[0-9]+)?(?:/[^\s]*)?)(?=\s|\b)#is',
    create_function('$m', 'if (!preg_match("#^(https?://)#", $m[2])) return $m[1]."<a href=\"http://".$m[2]."\" target=\"blank\">".$m[2]."</a>"; else return $m[1]."<a href=\"".$m[2]."\" target=\"blank\">".$m[2]."</a>";'),
    $url);