【问题标题】:PHP regex for image name with numbers带有数字的图像名称的 PHP 正则表达式
【发布时间】:2014-04-22 12:05:48
【问题描述】:

我的图片名称如下:

img-300x300.jpg
img1-250x270.jpg

这些名称将存储在字符串变量中。我的图片在 Wordpress 中,因此它将位于例如

mywebsite.com/wp-content/uploads/2012/11/img-300x300.jpg

我需要将字符串更改为

mywebsite.com/wp-content/uploads/2012/11/img.jpg

我需要一个 PHP 正则表达式,它会返回 img.jpg 和 img1.jpg 作为名称。

我该怎么做?

谢谢

加法

对不起各位,我试过了,但是没用

$string = 'img-300x300.jpg'
$pattern = '[^0-9\.]-[^0-9\.]';
$replacement = '';
echo preg_replace($pattern, $replacement, $string);

【问题讨论】:

  • 你应该发布你尝试过的内容
  • "并且我需要将字符串更改为mywebsite.com/wp-content/uploads/2012/11/img.jpg"。你确定吗 ?因为这种方式在该目录中只能有 1 个同名图像。
  • 这个问题解决了吗,还是你还有问题?

标签: php regex


【解决方案1】:

您可以使用 PHP 原生函数本身来做到这一点。

<?php

function genLink($imagelink)
{
$img1 = basename($imagelink);
$img = substr($img1,0,strrpos($img1,'-')).substr($img1,strpos($img1,'.'));
$modifiedlink = substr($imagelink,0,strrpos($imagelink,'/'))."/".$img;
return $modifiedlink;
}

echo genLink('mywebsite.com/wp-content/uploads/2012/11/flower-img-color-300x300.jpg');

OUTPUT :

mywebsite.com/wp-content/uploads/2012/11/flower-img-color.jpg

【讨论】:

  • @aelor,它们是正则表达式的分隔符。
  • 谢谢尚卡尔。我的图片在 Wordpress 中,因此它将位于例如mywebsite.com/wp-content/uploads/2012/11/img-300x300.jpg 我需要将字符串更改为 mywebsite.com/wp-content/uploads/2012/11/img.jpg
  • Shankar,这很好,但它似乎不适用于名称中包含连字符的图像,例如Flower-Image-2-300x500.png - 我需要将其更改为 Flower-Image-2.png
  • 感谢 Shankar,这正是我所需要的!!高度赞赏:)
【解决方案2】:

你可以这样做:

(img\d*)-([^.]*)(\..*)

\1\3 将包含您想要的内容:

演示:http://regex101.com/r/vU2mD4

或者,将(img\d*)-([^.]*)(\..*) 替换为\1\3

【讨论】:

【解决方案3】:

可能是这个?

(\w+)-[^.]+?(\.\w+)

$1$2 会给你你想要的。

【讨论】:

    【解决方案4】:

    搜索:\-[^.]+

    替换为:''

    【讨论】:

      【解决方案5】:
      (.[^\-]*)(?:.[^\.]*)\.(.*)
      

      第 1 组 - “-”之前的名称

      第 2 组 - 扩展。 (“。”之后的所有内容)

      【讨论】:

        【解决方案6】:

        只要只有一个-和一个.,那么explode()应该可以很好地解决这个问题:

        <?php
        
        // array of image names
        $images = array();
        $images[] = 'img-300x300.jpg';
        $images[] = 'img1-250x270.jpg';
        
        // array to store new image names
        $new_names = array();
        
        // loop through images
        foreach($images as $v)
        {
            // explode on dashes
            // so we would have something like:
            // $explode1[0] = 'img';
            // $explode1[1] = '300x300.jpg';
            $explode1 = explode('-',$v);
        
            // explode the second piece on the period
            // so we have:
            // $explode2[0] = '300x300';
            // $explode2[1] = 'jpg';
            $explode2 = explode('.',$explode1[1]);
        
            // now bring it all together
            // this translates to
            // img.jpg and img1.jpg
            $new_names[] = $explode1[0].'.'.$explode2[1];
        }
        
        echo '<pre>'.print_r($new_names, true).'</pre>';
        
        ?>
        

        【讨论】:

          【解决方案7】:

          这是一个有趣的问题,由于您使用的是 php,因此可以通过重置分支(Perl、PCRE 和一些其他引擎的功能)很好地解决它。

          搜索:img(?|(\d+)-\d{3}x\d{3}|-\d{3}x\d{3})\.jpg

          替换:img\1.jpg

          与模糊替换相比,此解决方案的好处是我们确信我们匹配的文件名称与您指定的格式匹配。

          【讨论】:

          • 分支什么??我试过img12-300x300.jpg,但失败了
          • 正确的搜索模式应该是:img(?|(\d)-\d{3}x\d{3})\.jpg
          • @aelor 它失败了,因为 OP 在 img 后面指定了一个数字 img1-250x270.jpg,所以这就是我交付的。如果你想要几个,我们需要捕获\d+这可能不是一件坏事,即使他没有请求它,所以我会补充。
          • @EduardoVerdugoCáceres 抱歉,这是不正确的。我提供的模式是正确的。你的不匹配 img-300x300.jpg
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-23
          • 2010-10-25
          • 1970-01-01
          • 1970-01-01
          • 2011-11-21
          • 2010-09-21
          相关资源
          最近更新 更多