我想使用正则表达式验证文件路径。到目前为止,我已经想到了这个:
preg_match('/[^A-Za-z0-9\.\/\\\\]/', $string);
如果字符串包含除了A-Z、a-z、0-9、点、反斜线和正斜线之外的任何其他字符,则它将返回1。
如何使它在字符串中有超过两个点或者点在字符串末尾时也返回1?
以及如何允许:
,但仅当它作为第二个字符并跟随\
或/
时才允许?例如c:\file
应该是有效的。
针对前两个要求:
preg_match('/[^A-Za-z0-9\.\/\\\\]|\..*\.|\.$/', $string);
\A[^:]*+(?:(?
\..*\.
将匹配超过两个点的内容。\.$
将匹配结尾的点。通过使用 |
分隔每个部分(包括您原始的正则表达式),使其匹配任何一个表达式(这称为交替)。
最后一个要求有点棘手,因为如果我理解正确,如果有一个:
,需要返回 1,除非唯一的冒号是第二个字符,并且它后面跟随一个\
或 /
。以下正则表达式(作为PHP字符串)应该可以做到这一点:
\A[^:]*+(?:(?
'/:(?!(?<=^[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
:
到字符类中,否则每个:
都会导致正则表达式匹配。 :(?!(?<=^[a-zA-Z]:)[\/\\\\])
是你评论中正则表达式的否定形式(除了.
,你真的想让C:.test
有效吗?)。 - Andrew Clark