Regex没有按预期工作-确定路径是否正确

  • 本文关键字:路径 是否 工作 Regex php regex
  • 更新时间 :
  • 英文 :


我很难在我的文件中完成一个正则表达式来捕捉正确的模式。

这是我让运行的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-11123123123-1或简单地只有1123123123。在任何情况下,1都不应该匹配以123123123-1.png12111111.jpg结尾的提供的路径。

因此,如果$groupCode为1,它应该只匹配1.jpg1.png1-1.png1-9999.jpg

如果$groupCode123-1,它应该只匹配123-1.jpg123-1.png123-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"
}

相关内容

  • 没有找到相关文章