如何在PHP中匹配/替换字符串?

时间:2019-04-11 15:52:07

标签: php regex preg-replace preg-match regex-group

我需要删除一部分字符串,问题是我不知道开头的位置或字符,甚至结尾也不知道。

示例1:

  

源字符串:image_807x400.jpg

     

预期结果:image.jpg

示例2:

  

源字符串:image-7x2.jpg

     

预期结果:image.jpg

那一刻,我找到了解决方案,但要花很多时间:

function replace($output)
{
    $final = array();
    foreach ($output as $table => $files) {
        foreach ($files as $file => $ids) {
            for ($i = 0; $i <= 9999; $i++) {
                for ($j = 0; $j <= 9999; $j++) {
                    $param = '_' . $i . 'x' . $j . '.';

                    $exist = strpos($file, $param);

                    if (!$exist) {
                        $param = '-' . $i . 'x' . $j . '.';
                        $exist = strpos($file, $param);
                    }

                    if ($exist) {
                        $newFileName = str_replace($param, '.', $file);
                        $final[$table][$file] = $newFileName;
                    }
                }
            }
        }
    }
    return $final;
}

4 个答案:

答案 0 :(得分:1)

对于示例数据,您可以使用preg_replace并使用\K来忘记匹配的内容:

\w+\K[_-]\d+(?:x\d+)?

Regex demo | Php demo

例如:

$strings = [
    "image_807x400.jpg",
    "image-7x2.jpg",
    "actuality_1x30.jpg",
    "team_1200x800.jpg ",
    "help_504x300.jpg",
    "image2_807x400",
    "2Dimage_01",
    "2D-image_01"
];

foreach ($strings as $string) {
    echo preg_replace('/\w+\K[_-]\d+(?:x\d+)?/', '', $string) . PHP_EOL;
}

结果:

image.jpg
image.jpg
actuality.jpg
team.jpg 
help.jpg
image2
2Dimage
2D-image

答案 1 :(得分:1)

我无法理解所有的循环名和变量名,所以只需修改一下即可:

$info = pathinfo($file);
preg_match('/^[a-z]+/i', $info['basename'], $match);
$final = $match[0].$info['extension'];
  • 获取基本名称
  • [a-z]开头仅匹配字母^,其中i表示不区分大小写
  • 添加扩展名

答案 2 :(得分:0)

最后我找到了解决方法:

$newFileName = preg_replace('/\K[_-]\d+x\d+/', '', $file);

答案 3 :(得分:0)

此正则表达式可以通过创建两个组来覆盖您的实例,这两个组是您的第一个部分单词以及包括扩展名在内的所有其他内容。您可能只需要添加输出数组中最初的第一个单词中可能不包含的[a-z]以外的任何其他字符。

从右侧绑定正则表达式可能不是最好的主意,因为您可能拥有JPGJPEGjpg和其他类似于以下内容的扩展名:

$output = array(
    'table1' => array(
        '1' => 'image_807x400.jpg',
        '2' => 'image-7x2.jpg',
        '3' => 'image-7x2.JPEG',
        '4' => 'image-7x2.JPG',
        '5' => 'image-7x2.PNG',
        '6' => 'image_807x400.png',
        '7' => 'image_807x400.gif',
        '8' => 'image_807x400.GIF',
    ),
    'table2' => array(
        '1' => 'image_807x400.jpg',
        '2' => 'image-7x2.jpg',
        '3' => 'image-7x2.JPEG',
        '4' => 'image-7x2.JPG',
        '5' => 'image-7x2.PNG',
        '6' => 'image_807x400.png',
        '7' => 'image_807x400.gif',
        '8' => 'image_807x400.GIF',
    ),
    'table3' => array(
        '1' => 'actuality_1x30.jpg',
        '2' => 'help_504x300.jpg',
        '3' => 'team_1200x800.jpg',
    ),
);

replace($output);

function replace($output)
{
    $final = array();
    foreach ($output as $table => $files) {
        foreach ($files as $file => $ids) {
            $final[$table][$file] = preg_replace('/(?:^|(?:\.\s))([a-z]+)(.*)/s', '$1.jpg', $output[$table][$file]);
        }
    }
    var_dump($final);
    return $final;
}

输出

array(3) {
  ["table1"]=>
  array(8) {
    [1]=>
    string(9) "image.jpg"
    [2]=>
    string(9) "image.jpg"
    [3]=>
    string(9) "image.jpg"
    [4]=>
    string(9) "image.jpg"
    [5]=>
    string(9) "image.jpg"
    [6]=>
    string(9) "image.jpg"
    [7]=>
    string(9) "image.jpg"
    [8]=>
    string(9) "image.jpg"
  }
  ["table2"]=>
  array(8) {
    [1]=>
    string(9) "image.jpg"
    [2]=>
    string(9) "image.jpg"
    [3]=>
    string(9) "image.jpg"
    [4]=>
    string(9) "image.jpg"
    [5]=>
    string(9) "image.jpg"
    [6]=>
    string(9) "image.jpg"
    [7]=>
    string(9) "image.jpg"
    [8]=>
    string(9) "image.jpg"
  }
  ["table3"]=>
  array(3) {
    [1]=>
    string(13) "actuality.jpg"
    [2]=>
    string(8) "help.jpg"
    [3]=>
    string(8) "team.jpg"
  }
}