对字符串进行正则表达式验证

5

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

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

如果字符串包含除了A-Z、a-z、0-9、点、反斜线和正斜线之外的任何其他字符,则它将返回1。

如何使它在字符串中有超过两个点或者点在字符串末尾时也返回1?

以及如何允许:,但仅当它作为第二个字符并跟随\/时才允许?例如c:\file应该是有效的。


尝试访问文件并捕获错误。不要费心验证。 - nhahtdh
2个回答

9

针对前两个要求:

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]:[./\\]”?所以如果它不匹配,它应该失败。 - Alex
@Alex 请看我的编辑,旧版本的问题在于需要从你原始的正则表达式中添加:到字符类中,否则每个:都会导致正则表达式匹配。 :(?!(?<=^[a-zA-Z]:)[\/\\\\])是你评论中正则表达式的否定形式(除了.,你真的想让C:.test有效吗?)。 - Andrew Clark
不是的,但我不小心在列表中加了一个点 :) 再次感谢 :P - Alex

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接