PHP /正则表达式 - 通过检测的.com / .NET / .ORG /埃杜等转换的URL链接(

2019-06-23 13:01发布

我知道已经有很多问题,请求帮助转换的网址字符串中可点击的链接,但我还没有找到完全是我要找的。

我希望能够匹配任何的下面的例子,把它们变成可点击的链接:

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需要进行较大的“正常”的文本字符串中找到。 例如,我想匹配“domain.net”“你好!来看看domain.net!”。

我认为这可能与正则表达式,可以确定匹配的网址是否包含.COM,.NET,.ORG,或.edu的后跟正斜杠或空格来完成。 除了用户错字,我无法想象在一个有效的URL将有那些其次是其他任何一个其他任何情况。

我知道有很多有效的域扩展在那里,但我并不需要支持他们。 我可以只选择其中的东西,如支持(COM |网络|组织| EDU)在正则表达式。 不幸的是,我没有足够的技术与正则表达式尚未知道如何正确地实现这一点。

我希望有人能帮助我找到一个正则表达式(与PHP的preg_replace函数使用),可以根据只是由一个或多个点,并连接任何文本匹配网址以指定扩展名跟空格或包含一个之一结束指定扩展后跟斜杠和可能的文件夹。

我做了几个搜索,到目前为止还没有找到我要找的。 如果已经有一个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的代码修改后的版本,到目前为止,似乎做正是我想要的。 谢谢!

Answer 1:

你可以使用这个表达式:

#(\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";

OUTPUT:

<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:此正则表达式仅支持HTTP和HTTPS URL方案。 因此,例如:如果你想支持FTP还那么你需要修改的正则表达式一点。



Answer 2:

'/(http(s)?:\/\/)?[\w\/\.]+(\.((com)|(edu)|(net)|(org)))[\w\/]*/'

这适用于你的例子。 您可能要添加额外字符的支持“ - ”,“ - ”,“:”等在过去的支架“?”。

'/(http(s)?:\/\/)?[\w\/\.]+(\.((com)|(edu)|(net)|(org)))[\w\/\?=&-;]*/'

这将支持参数和端口号。

例如:www.foo.ca:8888/test?param1=val1&param2=val2



Answer 3:

万分感谢。 我修改了他最终的解决方案,以允许所有的域(.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);


文章来源: PHP / RegEx - Convert URLs to links by detecting .com/.net/.org/.edu etc