尝试为1d条形码创建正则表达式(RegexIterator)

时间:2014-02-19 08:22:06

标签: php regex

我正在尝试创建一个正则表达式,以便通过图片文件夹中的产品条形码找到正确的图片。 该文件夹包含4500张图片。 该文件的名称可以是4种格式。

  1. XXXXXX.jpg / png - 短条码未知字符数(仅限数字)。
  2. 00000(从1到未知数量的前导零)XXXX(然后是短条形码).jpg / png
  3. 729(作为前导号码)00000(从1到未知数量的前导零)XXXX(然后是短条码).jpg / png
  4. 72900000XXXXXXYYY YYY YYY.jpg / png与选项3相同,但有一些字符(Y代表一个字符)。
  5. 我想出了类似的东西:

    $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
    

    但它不起作用。 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

你有四个相互积累的案例:

  1. 仅限数字,1至无限次:\d+
  2. 带有前导零的
  3. 1。:实际上与 1相同。,因为零是数字;)此处不需要特殊情况
  4. 1。可选地以729(?:729)?\d+开头(这可能已用于案例1.-3。)
  5. 3。带有可选字符(零到无限制):(?:729)?\d+(?:[a-zA-Z])*
  6. 仅添加扩展名:

    ((?:729)?\d+(?:[a-zA-Z])*\.(?:jpg|png))
    

    现在剩下一件事了。此正则表达式将匹配abc123.jpg,因为123.jpg完全有效。为了解决这个问题,我们添加^(这表示输入的开始):

    ^((?:729)?\d+(?:[a-zA-Z])*\.(?:jpg|png))
    

    demo @ regex101

    当您自己插入条形码(来自案例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))
    

    demo @ regex101

答案 1 :(得分:1)

根据我的理解 - 选项1-3都是相同的(729是与其他数字相同的数字字符串):

^\d+(?:jpg|png)$

使用4,您说“允许单词字符和空格,但仅当名称以729开头时”。所以现在是:

(?:(?:^\d+[.](?:jpg|png)$)|(?:^729\d*[\w\s]+[.](?:jpg|png)$))

<强> Demo here

\s匹配空格,'\ w'匹配单词字符。