我正在使用xampp测试我的网站,使用正则表达式检测链接并将它们转换为可单击格式,但当用户输入www.example.com而不是https://www.google.com时,链接将重定向到localhost/www.google.comwww.google.com instead of https://www.google.com the link redirects to localhost/www.google.com
我的代码
function link_detect($text){
$ex = "/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/i";
return preg_replace($ex,'<a class="click_link" href="$1" target="_blank">$1</a>', $text);
}
2条答案
按热度按时间vxf3dgd41#
实际上,这与正则表达式无关,更多的是与链接有关。
在锚点中,浏览器知道链接指向互联网上 * 别处 * 的站点的唯一方法是提供URI。
http://
表示URI(使用http
方案)。记住,在大多数文件系统中,一个文件可以有多个点,所以当你说 *go to
www.google.com
* 时,浏览器会认为你想去的是一个名为www
,扩展名为.google.com
的文件,它和foo.tar.gz
没有什么不同。如果有的话,只需要在URL前面加上一个
//
,在浏览器中,这意味着 * 在URL前面加上这个页面的任何协议/方案(http
/https
/file
),并将其视为外部链接 *。将其转换为Regex
一种可能的解决方案是尝试检测
(((https?|file):)?\/\/)?
,从中提取第4组(https?|file
,它将找到http
、https
或file
),然后将其预先挂在链接的开头,始终提供//
。这样,如果没有指定方案,链接仍然会告诉浏览器使用默认方案,无论当前页面使用什么 *,并且 * 链接是 * 外部 *。
((((?:([A-Za-z]{3,9}):)?(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)
组
4
现在拥有协议(即http:
)。将其中的任何内容添加到链接中,并在其后面添加//
(always)。j5fpnvbx2#
这只是因为您没有提供
http://
。试试这个
备选方案:
更新
来自@Mr. coder的评论
但是如果链路已经有
http://
协议连接到它,那么href
将像http://http://www.google.com
是的,更新我的答案为
link_detect()
。