使用PHP删除具有不同字符串长度的字符串的结尾

使用PHP删除具有不同字符串长度的字符串的结尾,php,regex,Php,Regex,使用PHP,我有一个数组,可以为图像返回以下数据: Array ( [0] => http://website.dev/2014/05/my-file-name-here-710x557.png [1] => 710 [2] => 557 [3] => 1 ) 基于上面的演示数据,我需要以某种方式将此图像URL转换为: http://website.dev/2014/05/my-file-name-here.png从字符串中删除-710x

使用PHP,我有一个数组,可以为图像返回以下数据:

Array
(
    [0] => http://website.dev/2014/05/my-file-name-here-710x557.png
    [1] => 710
    [2] => 557
    [3] => 1
)
基于上面的演示数据,我需要以某种方式将此图像URL转换为:

http://website.dev/2014/05/my-file-name-here.png
从字符串中删除
-710x557

需要记住的是:

  • 文件扩展名可以更改,并且可以是任何类型的文件类型
  • 710x557可能并不总是一个3位数x 3位数的数字。可能是2或4
  • 我之所以提到这一点,是为了说明我不能简单地使用PHP的字符串函数删除字符串中最后的12个字符,然后再添加文件扩展名,因为最后的字符串有时可能在10到14个字符之间,而不一定是12个字符

    我希望避免使用繁重的正则表达式代码,但如果这是唯一或最好的方法,那么我会说继续使用它


    如何编写一个正则表达式来删除PHP中长度可变的字符串的结尾?

    您可以使用如下正则表达式:

    -\d+x\d+(\.\w+)$
    

    您可以使用的代码是:

    $re = "/-\\d+x\\d+(\\.\\w+)$/"; 
    $str = "http://website.dev/2014/05/my-file-name-here-710x557.png"; 
    $subst = '\1'; 
    
    $result = preg_replace($re, $subst, $str, 1);
    

    我们的想法是使用
    -\d+x\d+
    (我们将去掉它)匹配分辨率
    -NumbersXNumbers
    ,然后使用捕获组使用
    (\。\w+$
    捕获文件扩展名。检查上面的替换部分。

    < P>只要它是2个数字的集合,中间有一个“X”,后面有一个破折号,你可以使用这个正则表达式:

    -[\d]*x[\d]*
    
    $string = 'http://website.dev/2014/05/my-file-name-here-710x557.png';
    $pattern = '/-[\d]*x[\d]*/';
    $replacement = '';
    echo preg_replace($pattern, $replacement, $string);
    

    您可以按以下方式使用:

    $str = substr($str, 0, strrpos($str, '-')) . substr($str, strrpos($str, '.'));
    

    请参见您可以使用此基于正则表达式的代码:

    $str = "http://website.dev/2014/05/my-file-name-here-710x557.png"; 
    $re = '/-([^-]+)(?=\.[^-]*$)/'; 
    
    $result = preg_replace($re, '', $str, 1);
    //=> http://website.dev/2014/05/my-file-name-here.png
    

    strrpos将始终返回字符串中最后出现的子字符串。因此,只要维度前的破折号是字符串中的最后一个破折号,这应该可以工作。如果没有破折号怎么办?如果没有破折号,它将不工作。我假设文件名的结构总是WxH.(png | gif | jpg)。这个条件在哪里
    它可以是2或4
    或。。。如果尺寸小于10x10怎么办?它变成一个一位数x一digit@PeeHaa他没有说会很重,但有些正则表达式可能很重。对于一个PHP新手来说,即使相对较短的正则表达式也可能看起来很吓人和沉重。那是什么表情。。。“解决regex的问题意味着你现在有两个问题”围绕这个问题的元讨论是。扩展名检查和$需要存在,否则事情会变得非常糟糕-如果文件名是这样的话会怎么样:
    mycol1024x1024photo-710x557.png
    ,并且你应该使用
    +
    (至少一个)而不是
    *
    (意思是0或更多)否决票只是因为问题相对简单还是因为答案的优点?@anubhava,是的,否决票只是因为你回答了一个极其琐碎的问题。作为SO的前100名成员,你应该专注于需要专业知识和洞察力的问题。而不是一些“plz wrait regexp 4 me”帖子。@anubhava你可能会。你的意图总是很清楚的,但从长远来看你并没有帮助OP。@Fede因为你可能在帮助一个吸血鬼?也不要尝试混合双引号和单引号。保持一致。我会用单引号,这样我就不需要逃避反斜杠了。那么,我是不是被打倒了投票是因为我在帮助别人?否决票是在回答没有用的时候。好的哲学…帮助别人?我已经说过了一点。TLDR:从长远来看,你不会帮助任何人。@HamZa实际上这是一篇很好的帖子,我同意一些部分。也许也应该为regex创建一个分支。顺便说一句,正如我所说的,否决票是在回答没有用的时候没用,我不认为这是我的。@哈姆扎,那只是废话。我看不出我们为什么要“惩罚”。帮助别人解决问题的人,到此为止。如果你对这个问题有问题,还有其他途径。因为这是一个公认的答案,而且是一个非常明确的答案,它显然已经帮助了别人,不能“长期不帮助任何人”。在我看来,这只是一个错位的仇恨。
    $str = "http://website.dev/2014/05/my-file-name-here-710x557.png"; 
    $re = '/-([^-]+)(?=\.[^-]*$)/'; 
    
    $result = preg_replace($re, '', $str, 1);
    //=> http://website.dev/2014/05/my-file-name-here.png