【问题标题】:RegEx - How To Insert String Before File ExtensionRegEx - 如何在文件扩展名之前插入字符串
【发布时间】:2011-01-26 15:23:44
【问题描述】:

如何将“_thumb”插入到动态生成的文件中。

例如,我有一个允许用户上传图片的网站。该脚本获取图像,对其进行优化并保存到文件中。如何让它为优化图像插入字符串“_thumb”?

我目前正在保存 1 个版本的 otpimized 文件。 ch-1268312613-photo.jpg

我想将原始字符串保存为上面的字符串,但想附加“_thumb”,如下面的字符串 ch-1268312613-photo_thumb.jpg

【问题讨论】:

    标签: php regex


    【解决方案1】:

    假设您想在第一个出现的点之前注入子字符串,preg_replace() 是一种直接技术。在模式中使用字符串锚的开头和否定字符类,最多只能有一个替换。因为\K重新开始全串匹配,替换字符串只替换匹配的文字点。

    代码:(Demo)

    $strings = [
        "ch-1268312613-photo.jpg",
        "foo.inc.php",
        ".htaccess",
        "no_ext",
    ];
    
    var_export(
        preg_replace(
            '~^[^.]*\K\.~',
            '_thumb.',
            $strings
        )
    );
    

    输出:

    array (
      0 => 'ch-1268312613-photo_thumb.jpg',
      1 => 'foo_thumb.inc.php',
      2 => '_thumb.htaccess',
      3 => 'no_ext',
    )
    

    只是为了好玩,这些 2-call 技术也可以工作:(Demo)

    echo implode('_thumb.', explode('.', $string, 2));
    

    echo implode('_thumb', sscanf($string, '%[^.]%s'));
    

    【讨论】:

      【解决方案2】:
       preg_replace("/(\w+)\.(\w+)/","'\\1_thumb.\\2'","test.jpg"); 
      

      我认为使用正则表达式的速度要快得多,而且对于 灵活性。

      但我承认 Chad 的解决方案优雅而有效

      【讨论】:

      • 这有几个问题。您没有转义模式中的句点,因此它将完全匹配任何字符。此外,\w 并未涵盖所有可能的文件名字符。
      • 没错,因为我没有把它标记为代码所以\。被解释为 .再次为真,但文件系统是否有权使用任何字符,我敢打赌没有
      • 好一个!但我会这样做: preg_replace("/^(.+)\.(\w+)$/","\\1_thumb.\\2",$filename); -- 检查“local.server.com/wp-content/uploads/2017/07/filename.jpg
      【解决方案3】:

      与其采用正则表达式路由(或其他粗略的字符串操作),不如使用一些与文件名相关的函数可能更容易使用:即 pathinfo(获取文件扩展名)和 basename(获取文件名减去扩展名)。

      $ext   = pathinfo($filename, PATHINFO_EXTENSION);
      $thumb = basename($filename, ".$ext") . '_thumb.' . $ext;
      

      编辑:@tanascius 对非常相似的答案感到抱歉,我想我应该在写这篇文章时检查一下这个小弹出窗口(花了一段时间,我分心了)。

      【讨论】:

      • 不太值得一个新的答案,但这可以是一行:pathinfo($filename,8) . '_thumb.' . pathinfo($filename,4);
      【解决方案4】:

      假设您在字符串中只出现一次“.jpg”,您可以使用str_replace 而不是正则表达式

      $filename = str_replace(".jpg", "_thumb.jpg", $filename);
      

      或者更好的是,substr_replace 只是将字符串插入到中间的某个位置:

      $filename = substr_replace($filename, '_thumb', -4, 0);
      

      【讨论】:

        【解决方案5】:

        为什么要使用正则表达式?分机总是.jpg 并且只有一个分机吗?也许您可以将其替换为_thumb.jpg

        如果不是那么简单,您可以使用 pathinfo 之类的函数来提取基本名称 + 扩展名并在那里进行替换。这在没有正则表达式的情况下也可以工作,这在这里可能有点矫枉过正:

        $info = pathinfo( $file );
        $no_extension =  basename( $file, '.'.$info['extension'] );
        echo $no_extension.'_thumb.'.$info['extension']
        

        【讨论】:

          【解决方案6】:
          $str = "ch-1268312613-photo.jpg";
          print preg_replace("/\.jpg$/i","_thumb.jpg",$str);
          

          【讨论】:

            【解决方案7】:

            无需使用正则表达式。这样就可以了:

            $extension_pos = strrpos($filename, '.'); // find position of the last dot, so where the extension starts
            $thumb = substr($filename, 0, $extension_pos) . '_thumb' . substr($filename, $extension_pos);
            

            【讨论】:

            • 不会像.tar.gz这样的东西
            猜你喜欢
            • 1970-01-01
            • 2017-10-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多