使用 preg_replace 将绝对URL转换为相对URL

8

(我搜索了一下,发现有很多关于将相对url转换为绝对url的问题,但没有关于从绝对url到相对url的。)

我想从表单字段获取输入,并最终得到一个相对url。理想情况下,它可以处理以下任何输入并最终得到/page-slug

  • http://example.com/page-slug
  • http://www.example.com/page-slug
  • https://example.com/page-slug
  • https://www.example.com/page-slug
  • example.com/page-slug
  • /page-slug
  • 也许还有更多我没想到的...

编辑:我也想让它适用于相对url为例如/page/post的情况(即带有多个斜杠的情况)。


我会反转字符串,匹配第一个斜杠之前的所有内容,然后再次反转所匹配的内容。 - Chris Laplante
删除第一个正斜杠之前的所有内容? - Zirak
@SimpleCoder - 如果相对URL是类似于/page/post这样的东西,那么这个方法是否可行?我会进行编辑以反映这种情况。 - Travis Northcutt
@Zirak 我不确定我理解得对不对。在“http://”中有两个正斜杠。我想,如果我首先删除任何 http:// 或 https:// 的实例,那么这可能会起作用。不过我猜可能会有更加优雅的解决方案。 - Travis Northcutt
parse_url() 对你来说不够用吗? - Greg Guida
显示剩余2条评论
4个回答

12

如果你经常使用URL,请查看parse_url。具体来说:

parse_url($url, PHP_URL_PATH)

顺便提一下,我测试了所有你提供的输入,它在除了example.com/page-slug之外都可以正常工作。


3

尝试使用这个正则表达式。

#^              The start of the string
(
   ://          Match either ://
   |            Or
   [^/]         Not a /
)*              Any number of times
#

将其替换为空字符串。
$pattern = '#^(://|[^/])+#';
$replacement = '';
echo preg_replace($pattern, $replacement, $string);

2

我认为您想要获取主机名后面的URL部分,您可以使用parse_url函数:

$path = parse_url($url, PHP_URL_PATH);

请注意,这会获取主机名后的整个URL,所以http://example.com/page/slug将给出/page/slug

1
如果您了解您的应用程序,我会使用一种有点hacky的方法来完成这个。我会使用正则表达式来搜索


[a-z].([(com|org|net)])

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