Как сопоставить / заменить строку в PHP? - PullRequest
0 голосов
/ 11 апреля 2019

Мне нужно удалить часть строки символов, проблема в том, что я не знаю ни позиции, ни символа начала, даже для конца.

Пример 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 ]

1 голос
/ 11 апреля 2019

Я не могу разобраться во всех циклах и именах переменных, поэтому просто адаптируйте это:

$info = pathinfo($file);
preg_match('/^[a-z]+/i', $info['basename'], $match);
$final = $match[0].$info['extension'];
  • Получить базовое имя
  • Совпадение только букв [a-z] в начале ^, где i означает без учета регистра
  • Добавить расширение
1 голос
/ 11 апреля 2019

В качестве примера вы можете использовать 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
0 голосов
/ 11 апреля 2019

Это регулярное выражение может охватывать ваши экземпляры, создавая две группы: ваше первое частичное слово и все остальное, включая расширение (я).Вам может понадобиться добавить только другие символы, кроме [az], которые могут быть в вашем первом слове в выходном массиве.

Возможно, не самая лучшая идея ограничить ваше регулярное выражение справа, поскольку у вас могут быть JPG, JPEG, jpg и другие расширения, подобные:

$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"
  }
}
0 голосов
/ 11 апреля 2019

Наконец я нашел решение:

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