根据正则表达式验证字符串


Validate string against regex

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

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

所以如果字符串有A-Z, A-Z, 0-9,点,'和/

以外的字符它将返回1

如果字符串中有两个以上的点,或者点在字符串的末尾,我如何使它也返回1 ?

我怎么能允许:,但只有当它作为第二个字符出现,然后是'/。例如,c:'file应该是有效的

对于前两个要求:

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

如果有两个以上的点,'..*'.将匹配。如果在末尾有一个点,'.$将匹配。通过用|分隔这些部分(包括您的原始正则表达式),它将使正则表达式匹配任何一个表达式(这称为交替)。

最后一个要求有点棘手,因为如果我理解正确的话,如果有:,您需要返回1,除非唯一的冒号是第二个字符,然后是'/。下面的regex(作为一个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;如果文件存在,则返回新路径。