【问题标题】:How to Programmatically Prefix an Image URL with PHP?如何使用 PHP 以编程方式为图像 URL 加上前缀?
【发布时间】:2017-10-15 18:59:48
【问题描述】:

我正在使用 PHP 和一个基于 JSON 的 API,它返回 2 个字段,其中包含属性照片的值:

  1. 照片网址
  2. has_large

photo_url 是常规大小的照片 URL。

示例: https://secure.example.org/Directory/AnotherDirectory/0008/102/12.jpg

如果 has_large = true,那么我们知道存在一张大照片,但 API 不会返回具体的 URL。

但是,从 API 文档中,我们知道,如果我们在图像文件名前加上一个“L”,这会为我们提供正确的大图像 URL:

示例: https://secure.example.org/Directory/AnotherDirectory/0008/102/L12.jpg

在将文件名写入数据库 (MySQL) 之前,如何以编程方式为文件名加上字母 L 前缀?

注意:所有照片的 URL 结构几乎相同。

每个属性的图片 URL 唯一变化的部分是:

  1. 指定属性 ID 的第 4 级目录(在上面的示例中 -- 102)
  2. 文件名本身,最多为 3 个数字(在上面的 URL 示例中 -- 12.jpg)

在对 RegEx、preg_replace() 进行数小时研究并在 StackOverflow 上寻找类似解决方案后,我仍然不确定如何使用 PHP 正确完成此操作。

任何帮助将不胜感激。提前致谢。

【问题讨论】:

    标签: php regex url-rewriting preg-replace filenames


    【解决方案1】:

    看来您只需要在文件名(不带路径)前加上L。没有路径的文件名除了在字符串末尾的/ 之外,在正则表达式中看起来是([^\/]+)$。因此期望的替换函数是:

    $large_photo_url = preg_replace('/([^\/]+)$/', 'L$1', $photo_url);
    

    【讨论】:

    • 你能解释一下 preg_replace 中的第二个参数 ($1) 是做什么的以及它是如何表示字母 L 的吗?
    • @ju1985oh $1 是第一个捕获组(从最后一个 / 到字符串末尾的所有内容)。
    【解决方案2】:

    这里我们使用explode 函数,将split 转换为/ 上的字符串,然后在该数组的最后值附加L

    解决方案 1:

    Try this code snippet here

    <?php
    
    $link="https://secure.example.org/Directory/AnotherDirectory/0008/102/12.jpg";
    $portions=explode("/",$link);
    $portions[count($portions)-1]="L".$portions[count($portions)-1];
    print_r(implode("/", $portions));
    

    解决方案 2:

    正则表达式: ([^\/]+)$

    1. ([^\/]+)匹配所有直到/(不包括这个),这里圈()大括号将捕获$1中的第一个捕获结果,

    2. $ 字符串结束。

    Regex demo

    <?php
    
    $link="https://secure.example.org/Directory/AnotherDirectory/0008/102/12.jpg";
    echo preg_replace("/([^\/]+)$/", 'L$1', $link);
    

    【讨论】:

      【解决方案3】:

      就我而言.. 我正在使用这个函数来获取更新的图像 url。

      function thumb_url($image_url=''){
      
          $prefix = 'thumb';
          $photo_url = preg_replace('/([^\/]+)$/', "{$prefix}$1", $image_url); 
      
          return $photo_url;
      }
      

      感谢@Dmitry。我只是用他的代码到这里。

      【讨论】:

        猜你喜欢
        • 2012-02-18
        • 2011-12-12
        • 2019-12-02
        • 1970-01-01
        • 1970-01-01
        • 2017-10-13
        • 2016-12-18
        相关资源
        最近更新 更多