【问题标题】:php glob pattern match for arbitray number of digitsphp glob模式匹配任意位数
【发布时间】:2013-01-08 12:18:32
【问题描述】:

php glob 函数可以匹配任意位数吗?我正在尝试匹配以两位到四位数字结尾的图像缩略图的文件名。

我知道我可以提供一个数字范围,但这只匹配单个字符:

glob("thumbname-[0-9]-[0-9].jpg")

这将匹配 thumbname-1-1.jpg 但不匹配 thumbname-10-10.jpg 等。

【问题讨论】:

    标签: php glob


    【解决方案1】:

    以下 glob 模式很复杂,但有效:

    +([0-9]|!(*[a-z]*)[0-9])
    

    匹配:11350000

    不匹配:1aa11a1

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案2】:

    您可以将数字拆分为不同的 glob 数组并合并它们。

    例如,首先将 0-9 的所有图像放入一个数组中:

    $g1 =  glob('thumbname-[0-9].jpg');
    

    之后,您创建另一个数组,其中包含 10 到 99 之间的数字:

    $g2 =  glob('thumbname-[0-9][0-9].jpg');
    

    现在你将这 2 个数组合并为一个,并从 0-99 中获取所有数组:

    $gResult = array_merge($g1, $g2);
    

    您可以随意扩展它,只需添加[0-9]

    【讨论】:

      【解决方案3】:

      glob() 的替代方法,使用带有正则表达式的 recursiveDirectoryIterator

      $Directory = new RecursiveDirectoryIterator('path/to/project/');
      $Iterator = new RecursiveIteratorIterator($Directory);
      $Regex = new RegexIterator($Iterator,
          '/^thumbname-[0-9]*-[0-9]*\.jpg$/i', 
          RecursiveRegexIterator::GET_MATCH
      );
      

      【讨论】:

      • 谢谢,我实际上可以使用这种方法,因为正则表达式会让我对模式有更多的控制。我已经接受了 glob 答案,因为它是原始问题。
      • 我最终还是采用了这种方法,因为 glob 模式太模糊了。我发现它会匹配删除附加文件的 thumbname-2-1-1.jpg。我最终使用的正则表达式是:'/^thumbname-[0-9]+-[0-9]+(@2x)?\.(jpg|jpeg|gif|png)$/i' 因为这给了我真正的任意数字和可选的视网膜后缀
      • 刚刚注意到它似乎与行锚的开头失败 ^ 似乎完整的文件路径得到了 RegexIterator 的测试,而不仅仅是文件名?
      • 这应该很容易改变,只需移除开始锚点......结束锚点仍然存在,并且正则表达式的第一部分是一个固定的“缩略图”它应该仍然可以正常工作
      【解决方案4】:

      尝试使用:glob("thumbname-[0-9]*-[0-9]*.jpg")

      我做了一个测试,它对我有用。

      【讨论】:

      • 这可能已经足够了,虽然它会匹配 thumbname-1a-1b.jpg
      • 这似乎是 glob 可以实现的最好的,但最后它太模棱两可了,因为它也匹配 thumbname-2-1-1.jpg。我最终将 RegexIterator 与我在 cmets 中发布的正则表达式一起使用
      • 它会这样工作 glob("thumbname-[0-9]+-[0-9]+.jpg") 吗?如果它应该只是数字......
      • 这是错误的。 * 匹配所有内容,而不仅仅是前面的任何表达式。 [0-9]* 匹配一个数字,然后是其他任何东西。 * 等价于 .* 在完整的正则表达式中,而不是 *
      • 如果你只想匹配thumbname-10-10.jpg thumbname-1a-1b.jpg,你想使用glob("thumbname-*[0-9]-*[0-9].jpg").....但是,这也将匹配@987654325 @ 所以它不是完美