【问题标题】:Regex for finding valid filename用于查找有效文件名的正则表达式
【发布时间】:2010-11-05 03:35:38
【问题描述】:

我想检查一个字符串是否是一个文件名(name DOT ext)。

文件名不能包含/ ? * : ; { } \

您能建议我在 preg_match() 中使用的正则表达式吗?

【问题讨论】:

  • 考虑foobar.htaccess 也是一个有效的文件名。
  • Windows 还是 *nix? POSIX 标准允许除NUL/ 之外的所有内容。
  • 另外,Windows 文件不能包含| " < >,可以包含{ }

标签: php regex validation preg-match


【解决方案1】:

这是一个易于使用的具有特定文件扩展名的解决方案:

$file = 'file-name_2020.png';
$extensions = array('png', 'jpg', 'jpeg', 'gif', 'svg');
$pattern = '/^[^`~!@#$%^&*()+=[\];\',.\/?><":}{]+\.(' . implode('|', $extensions). ')$/u';

if(preg_match($pattern, $discount)) {
    // Returns true
}

请记住,这种情况下允许的特殊字符只有 -_。要允许更多,只需将它们从 $pattern 中删除

【讨论】:

    【解决方案2】:

    在用于检查 Golang 程序中的 Unix 文件名的正则表达式下方:

        reg := regexp.MustCompile("^/[[:print:]]+(/[[:print:]]+)*$")
    

    【讨论】:

      【解决方案3】:

      正则表达式类似于(对于三个字母扩展名):

      ^[^/?*:;{}\\]+\.[^/?*:;{}\\]{3}$
      

      PHP 需要转义反斜杠,preg_match() 需要转义正斜杠,所以:

      $pattern = "/^[^\\/?*:;{}\\\\]+\\.[^\\/?*:;{}\\\\]{3}$/";
      

      要匹配"hosts"".htaccess" 之类的文件名,请使用这个稍加修改的表达式:

      ^[^/?*:;{}\\]*\.?[^/?*:;{}\\]+$
      

      【讨论】:

      • 你当然可以用“/”以外的东西来分隔 preg_match() 中的正则表达式,这消除了专门转义正斜杠的需要,但增加了转义新分隔符的需要(如果你想在正则表达式中使用它)。
      • 警告!像... 这样的文件名在某些情况下可能很危险,并且对^[^/?*:;{}\\]*\.?[^/?*:;{}\\]+$ 有效
      【解决方案4】:
      $a = preg_match('=^[^/?*;:{}\\\\]+\.[^/?*;:{}\\\\]+$=', 'file.abc');
      
      ^ ... $ - begin and end of the string
      [^ ... ] - matches NOT the listed chars.
      

      【讨论】:

      • 允许使用没有扩展名的文件:preg_match('=^[^/?*;:{}\\\\]+\.?[^/?*;:{}\\\\]?$=', 'file.abc');
      【解决方案5】:

      给你:

      "[^/?*:;{}\\]+\\.[^/?*:;{}\\]+"
      

      “一个或多个不是这些字符的字符,然后是一个点,然后是一些不是这些字符的字符。”

      (只要您确定该点确实是必需的 - 如果不是,那就很简单:"[^/?*:;{}\\]+"

      【讨论】:

      • @Richie,你真的需要在点分隔符之前的第二个反斜杠吗?不应该是 ...}\\]+\.[^/?....
      • @Rob Wells:这是必要的,因为 PHP 字符串也使用反斜杠作为转义字符。 PHP 字符串中的“\\”在正则表达式中被翻译为“\”。那 ”\。”被翻译成“\”。是由“\.”这一事实造成的巧合。对 PHP 没有任何意义,因此保持不变。尽管如此,不逃避反斜杠是草率的。
      • 出现错误。可能是我的错误,请参阅我输入了 $page_regex = "[[^/?*:;{}\]+\\.[^/?*:;{}\]+"; $len = $this->REQ_URI_PATH_E_LEN; //下面给出的 $this->REQ_URI_PATH_E_LEN 的长度 $page = $this->REQ_URI_PATH_E[$len - 1]; //保存路径元素,例如 0=>posts, 1=>hello, 2=>newp.php for localhost/posts/hello/newp.php?id=3 if(preg_match($page_regex,$page)) echo "page ";否则回显“文件夹”;错误是“警告:preg_match() [function.preg-match]:在 line 中找不到结尾匹配分隔符 ']'”我的语法可能有误,请纠正我。
      • 字符串的开头有两个左括号:"[[
      • 为什么不包括分隔符? /^[^\/\?\*:;{}\\\]+\.[^\/\?\*:;{}\\\]+$/
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-26
      • 2012-11-22
      相关资源
      最近更新 更多