编程语言
首页 > 编程语言> > PHP / RegEx-通过检测.com / .net / .org / .edu等将URL转换为链接

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

作者:互联网

我知道有很多问题需要帮助,以将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都会包含其中的一个,后跟其他内容.

我知道那里有许多有效的域扩展,但是我不需要全部支持.我可以选择使用正则表达式中的(com | net | org | edu)之类的东西来支持.不幸的是,我对regex不够熟练,还不知道如何正确实现这一点.

我希望有人可以帮助我找到一个正则表达式(用于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代码的修改版本,到目前为止似乎完全可以满足我的要求.谢谢!

解决方法:

您可以使用此正则表达式:

#(\s|^)((?:https?://)?\w+(?:\.\w+)+(?<=\.(net|org|edu|com))(?:/[^\s]*|))(?=\s|\b)#is

码:

$arr = array(
'http://www.domain.com/?foo=bar',
'http://www.that"sallfolks.com',
'This is really cool site: https://www.domain.net/ isn\'t it?',
'http://subdomain.domain.org',
'www.domain.com/folder',
'Hello! You can visit vertigofx.com/mysite/rocks for some awesome pictures, or just go to vertigofx.com by itself',
'subdomain.domain.net',
'subdomain.domain.edu/folder/subfolder',
'Hello! Check out my site at domain.net!',
'welcome.to.computers',
'Hello.Come visit oursite.com!',
'foo.bar',
'domain.com/folder',

);
foreach($arr as $url) {   
   $link = preg_replace_callback('#(\s|^)((?:https?://)?\w+(?:\.\w+)+(?<=\.(net|org|edu|com))(?:/[^\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>";'),
           $url);
   echo $link . "\n";

输出:

<a href="http://www.domain.com/?foo=bar">http://www.domain.com/?foo=bar</a>
http://www.that"sallfolks.com
This is really cool site: <a href="https://www.domain.net">https://www.domain.net</a>/ isn't it?
<a href="http://subdomain.domain.org">http://subdomain.domain.org</a>
<a href="http://www.domain.com/folder">www.domain.com/folder</a>
Hello! You can visit <a href="http://vertigofx.com/mysite/rocks">vertigofx.com/mysite/rocks</a> for some awesome pictures, or just go to <a href="http://vertigofx.com">vertigofx.com</a> by itself
<a href="http://subdomain.domain.net">subdomain.domain.net</a>
<a href="http://subdomain.domain.edu/folder/subfolder">subdomain.domain.edu/folder/subfolder</a>
Hello! Check out my site at <a href="http://domain.net">domain.net</a>!
welcome.to.computers
Hello.Come visit <a href="http://oursite.com">oursite.com</a>!
foo.bar
<a href="http://domain.com/folder">domain.com/folder</a>

PS:此正则表达式仅在URL中支持http和https方案.因此,例如:如果您还想支持ftp,则需要稍微修改一下正则表达式.

标签:hyperlink,url,php,regex
来源: https://codeday.me/bug/20191101/1983827.html