【问题标题】:Convert absolute to relative url with preg_replace使用 preg_replace 将绝对 URL 转换为相对 URL
【发布时间】:2011-10-24 10:18:36
【问题描述】:

(我搜索了很多关于将相对 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(即带有多个斜线的东西)。

【问题讨论】:

  • 我会反转字符串,匹配所有内容直到第一个斜线,然后反转你匹配的内容
  • 删除直到第一个正斜杠的所有内容?
  • @SimpleCoder - 如果相对 url 类似于 /page/post 会起作用吗?我将进行编辑以反映这种情况。
  • @Zirak 我不确定我是否遵循。 “http://”中有两个正斜杠。不过,我想如果我首先删除 http:// 或 https:// 的任何实例,这可能会起作用。不过,我猜可能会有更优雅的解决方案。
  • 不,你是对的,它不会。使用 steveo225 的方法。

标签: php regex preg-replace


【解决方案1】:

如果您一直在使用 URL,请查看 parse_url。具体来说:

parse_url($url, PHP_URL_PATH)

仅供参考,我根据您的所有输入对其进行了测试,除以下内容外,它都可以正常工作:example.com/page-slug

【讨论】:

    【解决方案2】:

    试试这个正则表达式。

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

    并将其替换为空字符串。

    $pattern = '#^(://|[^/])+#';
    $replacement = '';
    echo preg_replace($pattern, $replacement, $string);
    

    【讨论】:

      【解决方案3】:

      如果您了解您的应用程序,我会以一种有点笨拙的方式来做这件事。我会使用正则表达式来搜索

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

      【讨论】:

        【解决方案4】:

        我想你想要主机名后面的URL部分,你可以使用parse_url

        $path = parse_url($url, PHP_URL_PATH);
        

        请注意,这会在主机名之后获得整个 URL,因此http://example.com/page/slug 将给出/page/slug

        【讨论】:

          猜你喜欢
          • 2014-12-12
          • 2021-07-28
          • 2019-05-10
          • 1970-01-01
          • 1970-01-01
          • 2015-06-28
          • 2011-01-01
          • 2011-05-25
          相关资源
          最近更新 更多