16

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

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

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

4

5 回答 5

19

干得好:

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

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

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

于 2009-06-23T11:59:44.520 回答
6
$a = preg_match('=^[^/?*;:{}\\\\]+\.[^/?*;:{}\\\\]+$=', 'file.abc');

^ ... $ - begin and end of the string
[^ ... ] - matches NOT the listed chars.
于 2009-06-23T12:05:23.637 回答
2

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

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

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

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

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

^[^/?*:;{}\\]*\.?[^/?*:;{}\\]+$
于 2009-06-23T12:02:07.947 回答
1

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

    reg := regexp.MustCompile("^/[[:print:]]+(/[[:print:]]+)*$")
于 2017-06-07T12:52:34.800 回答
0

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

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

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

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

于 2020-09-08T13:33:53.487 回答