我需要删除一部分字符串,问题是我不知道开头的位置或字符,甚至结尾也不知道。
示例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;
}
答案 0 :(得分:1)
对于示例数据,您可以使用preg_replace并使用\K
来忘记匹配的内容:
\w+\K[_-]\d+(?:x\d+)?
例如:
$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]以外的任何其他字符。
从右侧绑定正则表达式可能不是最好的主意,因为您可能拥有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"
}
}