我很难在我的文件中完成一个正则表达式来捕捉正确的模式。
这是我让运行的PHP代码:
$imagesToAdd = [];
foreach (glob($imagePath.'/'.$groupCode.'*.{jpg,png}', GLOB_BRACE) as $filepath) {
$match = (int) preg_match('#'.$imagePath.'/'.$groupCode.'+([^D]|[-_d]?)+.(png|jpg)#', $filepath);
print $filepath . PHP_EOL;
print $imagePath.'/'.$groupCode.'+(|[D]|[-_d])+.(png|jpg)' . PHP_EOL;
var_dump($match);
if ($match !== 0) {
$imagesToAdd[] = $filepath;
}
}
这里的正则表达式是'#'.$imagePath.'/'.$groupCode.'+([^D]|[-_d]?)+.(png|jpg)#'
。让我们用一些例子来说明我的目标是什么,以及为什么它仍然失败。
让我们说正则表达式解析为:
/home/shop/test/release/20211005131411/pub/media/productImages/29192-7+([^D]|[-_d]?)+.(png|jpg)
,它将按预期正确获取所提供的路径。但现在我的问题来了。
我的$groupCode
可以是1
,1-1
或1123123123-1
或简单地只有1123123123
。在任何情况下,1
都不应该匹配以123123123-1.png
或12111111.jpg
结尾的提供的路径。
因此,如果$groupCode
为1,它应该只匹配1.jpg
或1.png
或1-1.png
或1-9999.jpg
。
如果$groupCode
是123-1
,它应该只匹配123-1.jpg
或123-1.png
或123-1-anyothernumber.(png|jpg)
。我要怎么做才能得到这里的正则表达式呢?
我目前的方法不完全有效,我已经没有办法了。
首先用一些静态数据替换glob()
,以获得可再现的示例。
$data = [
'/base-path/42.png',
'/base-path/42-1.png',
'/base-path/42.PNG',
'/base-path/21.png'
];
$imagePath = '/base-path';
$groupCode = '42';
注意事项:
- 如果您将变量值放入正则表达式中,则需要转义其中可能包含的特殊字符-使用
preg_quote()
。 - 验证模式需要锚定,否则这里可以是
^
和$
之前和之后的内容。
如果我理解正确的话,你想要匹配:
{path}/{code}.{image-extension}
and{path}/{code}-{digits}.{image-extension}
- 数字:
d
- 数字(至少一个):
d+
- 前缀-:
-d+
- 可选:
(-d+)?
- 与图像文件扩展名:
(-d+)?.(jpg|png)
- 扩展名不区分大小写:
(-d+)?.((?i)jpg|png)
放在一起:
$pattern = '(^'.preg_quote($imagePath.'/'.$groupCode).'(-d+)?\.((?i)png|jpg)$)';
var_dump($pattern);
$imagesToAdd = [];
foreach ($data as $file) {
echo 'Validating: ', $file, PHP_EOL;
$found = preg_match($pattern, $file);
echo $found ? ' - HIT' : ' - MISS', PHP_EOL;
if ($found) {
$imagesToAdd[] = $file;
}
}
var_dump($imagesToAdd);
输出:
string(40) "(^/base-path/42(-d+)?.((?i)png|jpg)$)"
Validating: /base-path/42.png
- HIT
Validating: /base-path/42-1.png
- HIT
Validating: /base-path/42.PNG
- HIT
Validating: /base-path/21.png
- MISS
array(3) {
[0]=>
string(17) "/base-path/42.png"
[1]=>
string(19) "/base-path/42-1.png"
[2]=>
string(17) "/base-path/42.PNG"
}