如何强制将HTML链接转换为绝对路径?

49

在我的网站上,用户可以在他们的个人资料中放置一个URL。

这个URL可以是http://www.google.comwww.google.comgoogle.com

如果我只是在我的PHP代码中插入<a href="$url">$url</a>,链接并不总是绝对的。

如何强制a标记为绝对?


2
请确保始终在链接前加上 http://(或协议相对链接的 //)。 - Pekka
1
你可以尝试使用window.location,但最好的方法是验证用户输入。提示他们提供有效的URL。 - ysrb
3个回答

68
如果您在URL前面加上//,将被视为绝对路径。例如:<a href="//google.com">Google</a>
请记住,这将使用页面所用的协议(例如,如果页面的URL为https://path/to/page,则生成的URL将为https://google.com)。

你还应该提到,如果只使用两个正斜杠指定绝对URI,则在连接到配置文件URL时将使用当前站点的协议,即https://yoursite.net将导致https://google.com,而http://yoursite.net将导致http://google.com。 - Edward Comeau
是的,这符合问题中的情况。顺便说一下,你的链接已经损坏(解析错误)。 - Marco Chiappetta
3
如果您的网站协议与 URL 协议不同,则此方法将无效。如果您的网站是 https,则 http 的 URL 将无法工作,因为它会自动转换成 https。 - DeepBlue
如果这个字段还存储电子邮件,那该怎么办?//会如何反应?如何解决包含电子邮件的问题? - Umar AlFarooq

11

使用协议,最好是http://

<a href="http://www.google.com">Google</a>

要求用户以此格式输入网址,如果未添加,请连接 http:// 。

如果只使用前缀 //,它将使用与页面提供服务的相同协议。

<a href="//google.com">Google</a>

9

我最近也需要做类似的事情。

if (strpos($url, 'http') === false) {
    $url = 'http://' .$url;
}

基本上,如果 URL 不包含“http”,则将其添加到字符串(前缀)的前面。
或者,我们可以使用正则表达式来实现这个功能。
$http_pattern = "/^http[s]*:\/\/[\w]+/i";

if (!preg_match($http_pattern, $url, $match)){  
   $url = 'http://' .$url;
}  

感谢 @JamesHilton 指出一个错误。谢谢!

1
这段代码总是会返回 false,因为如果在 $url 的开头找到了 http,它会返回 0,因为字符串 'http' 的位置从索引 0 开始。在 if 语句中,0 被认为是假值,所以你需要使用 === 运算符。 - James Hilton
@JamesHilton 哎呀,好尴尬!已经修复了,谢谢! - StephanieQ
2
如果您使用以下正则表达式,则可能会更好:"/^https?:\/{2}\w/i" - eddy85br

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接