5

我想用正则表达式验证文件路径。到目前为止,我想出了这个:

preg_match('/[^A-Za-z0-9\.\/\\\\]/', $string);

因此,如果字符串包含除 AZ、az、0-9、点、\ 和 / 之外的任何其他字符,它将返回 1

如果字符串中有两个以上的点,或者如果点位于字符串的末尾,我怎样才能使它也返回 1?

我怎么能允许:,但前提是它作为第二个字符出现并且后跟\or /。例如c:\file应该是有效的

4

2 回答 2

9

对于前两个要求:

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
于 2013-05-09T18:40:20.430 回答
1

如果这是针对您服务器上的文件的,那么这就是realpath的用途。它将解析对该路径的引用...检查该文件是否存在于该路径中。如果文件不存在则返回false,如果存在则返回新路径。

于 2013-05-09T18:40:27.043 回答