我想用正则表达式验证文件路径。到目前为止,我已经想出了这个:
preg_match('/[^A-Za-z0-9\.\/\\\\]/', $string);
所以如果字符串有除A-Z,a-z,0-9,dot,\和/
之外的任何其他字符,它将返回1如果字符串中有两个以上的点,或者如果点位于字符串的末尾,我该怎么做才能返回1?
我如何才允许:
但仅当它作为第二个字符存在且后跟\
或/
时才允许c:\file
。例如{{1}}应该有效
答案 0 :(得分:6)
对于前两个要求:
preg_match('/[^A-Za-z0-9\.\/\\\\]|\..*\.|\.$/', $string);
如果有两个以上的点,\..*\.
将匹配。如果最后有一个点,\.$
将匹配。通过用|
分隔这些部分(包括你的原始正则表达式),它将使正则表达式匹配任何一个表达式(这称为交替)。
最后一个要求有点棘手,因为如果我理解正确,如果有:
则需要返回1,除非唯一的冒号是第二个字符,然后是{{1} }或\
。以下正则表达式(作为PHP字符串)应该这样做:
/
或与其他正则表达式结合使用(请注意,我们还必须将'/:(?!(?<=^[a-zA-Z]:)[\/\\\\])/'
添加到第一个字符类中):
:
以下是对最后一篇文章的解释:
preg_match('/[^A-Za-z0-9\.\/\\\\:]|\..*\.|\.$|:(?!(?<=^[a-zA-Z]:)[\/\\\\])/', $string);
答案 1 :(得分:1)
如果这是针对您服务器上的文件,那么这就是realpath的用途。它将解析对.
和..
的引用,并检查该文件是否存在于该路径中。如果文件不存在则返回false,如果确实存在,则返回新路径。