我知道有很多问题需要帮助将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。
编辑:请注意,这些网址需要在较大的“普通”文字字符串中找到。例如,我想在“Hello!来看看域名网络!”中匹配“domain.net”。
我认为这可以通过正则表达式来完成,该正则表达式可以确定匹配的URL是否包含.com,.net,.org或.edu,后跟正斜杠或空格。除了用户输入错误之外,我无法想象任何其他情况,其中有效的网址会有其中一个跟随其他任何内容。
我意识到有很多有效的域扩展,但我不需要全部支持它们。我可以在正则表达式中选择支持(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代码的修改版本,到目前为止似乎完全符合我的要求。谢谢!
答案 0 :(得分:3)
您可以使用此正则表达式:
#(\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,那么你需要稍微修改一下正则表达式。
答案 1 :(得分:1)
'/(http(s)?:\/\/)?[\w\/\.]+(\.((com)|(edu)|(net)|(org)))[\w\/]*/'
这适用于您的示例。你可能想在最后一个括号中为“ - ”,“&amp;”,“?”,“:”等添加额外的字符支持。
'/(http(s)?:\/\/)?[\w\/\.]+(\.((com)|(edu)|(net)|(org)))[\w\/\?=&-;]*/'
这将支持参数和端口号。
例如:www.foo.ca:8888 / test?param1 = val1&amp; param2 = val2
答案 2 :(得分:0)
非常感谢。我修改了他的最终解决方案以允许所有域(.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);