我正在尝试创建一个正则表达式,以便通过图片文件夹中的产品条形码找到正确的图片。 该文件夹包含4500张图片。 该文件的名称可以是4种格式。
我想出了类似的东西:
$i = new RegexIterator($a, '($barcode)\D*|^([0][0-9]+$barcode)\D+|(729[0-9][0-9]+$barcode)\D+|(729[0-9][0-9]+$barcode).+/', RegexIterator::GET_MATCH);
$barcode - can be 7290000232 or 0000232 or 232
但它不起作用。 有什么想法吗?
答案 0 :(得分:1)
你有四个相互积累的案例:
\d+
729
:(?:729)?\d+
开头(这可能已用于案例1.-3。)(?:729)?\d+(?:[a-zA-Z])*
仅添加扩展名:
((?:729)?\d+(?:[a-zA-Z])*\.(?:jpg|png))
现在剩下一件事了。此正则表达式将匹配abc123.jpg
,因为123.jpg
完全有效。为了解决这个问题,我们添加^
(这表示输入的开始):
^((?:729)?\d+(?:[a-zA-Z])*\.(?:jpg|png))
当您自己插入条形码(来自案例1)时,几乎无需进行任何调整:
^((?:729)?0*?$barcode(?:[a-zA-Z])*\.(?:jpg|png))
在这里,我们必须插入第二个案例0*?
(0
零到无限次,懒惰)。
关于[a-zA-Z]
:你必须决定在这里允许什么。目前它只允许使用小写和大写字母。如果您想允许空格(例如),只需将它们添加到角色组:[a-zA-Z ]
。
对于非拉丁字符,您可以使用[\x{00BF}-\x{1FFF}\x{2C00}-\x{D7FF}a-zA-Z]
(信用到this comment)作为您的角色组,这样您的正则表达式就会如下所示:
^((?:729)?0*?123(?:[\x{00BF}-\x{1FFF}\x{2C00}-\x{D7FF}a-zA-Z])*\.(?:jpg|png))
答案 1 :(得分:1)
根据我的理解 - 选项1-3
都是相同的(729是与其他数字相同的数字字符串):
^\d+(?:jpg|png)$
使用4
,您说“允许单词字符和空格,但仅当名称以729开头时”。所以现在是:
(?:(?:^\d+[.](?:jpg|png)$)|(?:^729\d*[\w\s]+[.](?:jpg|png)$))
<强> Demo here 强>
\s
匹配空格,'\ w'匹配单词字符。