I'd like to validate file paths with a regular expression. So far I've come up with this:
preg_match('/[^A-Za-z0-9\.\/\\\\]/', $string);
so it will return 1 if the string has any other characters than A-Z, a-z, 0-9, dot, \ and /
How can I make it so it also returns 1 if there are more than two dots in the string, or if the dot is at the end of the string?
And how can I allow : but only if it's present as the 2nd character and followed by \ or /. For example c:\file should be valid
For the first two requirements:
preg_match('/[^A-Za-z0-9\.\/\\\\]|\..*\.|\.$/', $string);
The \..*\. will match if there are more than two dots. \.$ will match if there is a dot at the end. By separating each of these portions (including your original regex) with a | it will make it so the regex will match any one of the expressions (this is called alternation).
The last requirement is a little tricky, since if I understand correctly you need this to return 1 if there is a :, unless the only colon is the second character and it is followed by a \ or /. The following regex (as a PHP string) should do that:
'/:(?!(?<=^[a-zA-Z]:)[\/\\\\])/'
Or combined with the other regex (note that we also have to add : to the first character class):
preg_match('/[^A-Za-z0-9\.\/\\\\:]|\..*\.|\.$|:(?!(?<=^[a-zA-Z]:)[\/\\\\])/', $string);
Here is the explanation for that last piece:
: # 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With