用于过滤具有多个组合扩展名的文件的模式

时间:2019-02-19 10:05:06

标签: php regex

如何构造匹配的正则表达式

qwerty.html

但不是

qwerty.php.html

或任何组合的扩展名。我已经“创建”了这个"/(?!\..*)\.html$/",它返回0。如何使其工作?

这是我的代码:

$regexIterator = new RegexIterator(
    new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)),
    /(?!\..*)\.html$/
);
$files = (iterator_to_array($regexIterator));

3 个答案:

答案 0 :(得分:0)

仅当当前位置的右边没有(?!\..*)\.html$时,.html模式才在字符串的末尾与.匹配(强制执行(?!\..*)否定超前此限制)。请注意,前瞻模式末尾的.*没什么区别。由于\.中的\.html要求在(?!\..*)禁止它的地方有一个圆点,因此该模式将永远不会匹配任何字符串。

您可以使用

'~^[^.]*\.html$~'

请参见regex demo

详细信息

  • ^-字符串的开头
  • [^.]*-匹配.以外的0+个字符的negated character class
  • \.html-一个.html子字符串
  • $-字符串的结尾。

答案 1 :(得分:0)

使用以下正则表达式

^([^.]*)\.[^.]*$

它匹配仅包含一个点的字符串-示例here-说明

  • [^.]*匹配除点以外的任何字符

对于仅匹配的html文件,请使用^([^.]*)\.html*$

答案 2 :(得分:0)

您的正则表达式不起作用,因为您是在说下一个字符不应在其中包含句点(即(?!\..*)),而您立即说它们应该在其中(即.html)。

唯一可以接受的解决方案如下:

\.\w+\.html$(*SKIP)(*F)|\.html$

正则表达式live demo

正则表达式细目:

  • \.\w+\.html$匹配具有前面扩展名的.html文件
  • (*SKIP)(*F)扔掉
  • |
  • \.html$匹配没有扩展名的.html文件

这不允许.{alphanum + _}.html之类的

  • .php.html
  • .mp4.html
  • .j_p_g.html

但是不会同时弄乱不同的文件名,并且允许使用以下模式:

  • a.file.name@user.html