我想用正则表达式验证文件路径。到目前为止,我想出了这个:
preg_match('/[^A-Za-z0-9\.\/\\\\]/', $string);
因此,如果字符串包含除 AZ、az、0-9、点、\ 和 / 之外的任何其他字符,它将返回 1
如果字符串中有两个以上的点,或者如果点位于字符串的末尾,我怎样才能使它也返回 1?
我怎么能允许:
,但前提是它作为第二个字符出现并且后跟\
or /
。例如c:\file
应该是有效的
对于前两个要求:
preg_match('/[^A-Za-z0-9\.\/\\\\]|\..*\.|\.$/', $string);
\..*\.
如果有两个以上的点,则将匹配。\.$
如果末尾有一个点,将匹配。通过用 a 分隔这些部分(包括您的原始正则表达式)中的每一个|
,它将使正则表达式匹配任何一个表达式(这称为交替)。
最后一个要求有点棘手,因为如果我理解正确,如果有 a ,您需要它返回 1 :
,除非唯一的冒号是第二个字符,并且后面跟着 a \
or /
。以下正则表达式(作为 PHP 字符串)应该这样做:
'/:(?!(?<=^[a-zA-Z]:)[\/\\\\])/'
或者与其他正则表达式结合(注意我们还必须添加:
到第一个字符类):
preg_match('/[^A-Za-z0-9\.\/\\\\:]|\..*\.|\.$|:(?!(?<=^[a-zA-Z]:)[\/\\\\])/', $string);
这是最后一块的解释:
: # match a ':'
(?! # but fail if the following regex matches (negative lookahead)
(?<=^[a-zA-Z]:) # the ':' was the second character in the string
[\/\\\\] # the next character is a '/' or '\'
) # end lookahead
如果这是针对您服务器上的文件的,那么这就是realpath的用途。它将解析对该路径的引用.
并..
检查该文件是否存在于该路径中。如果文件不存在则返回false,如果存在则返回新路径。