2013-05-09 5 views
1

Я хотел бы проверить пути к файлам с регулярным выражением. До сих пор я придумал это:Validate string from regex

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

поэтому он будет возвращать 1, если строка имеет какие-либо другие символы, чем AZ, AZ, 0-9, точка, \ и/

Как я могу сделать так, чтобы он также возвращал 1, если в строке больше двух точек, или если точка находится в конце строки?

И как я могу разрешить :, но только если он присутствует в качестве второго символа, а затем \ или /. Например c:\file должен быть действительным

+0

Просто попробуйте получить доступ к файлу и поймать ошибку. Не утруждайте себя проверкой. – nhahtdh

ответ

4

Для первых двух требований:

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

\..*\. будет соответствовать, если есть более двух точек. \.$ будет соответствовать, если в конце есть точка. Разделив каждую из этих частей (включая исходное регулярное выражение) с помощью |, он сделает так, чтобы регулярное выражение соответствовало любому из выражений (это называется чередованием).

Последнее требование является немного сложнее, так как если я правильно понимаю, вам это нужно, чтобы вернуть 1, если есть :, если только двоеточие не является второй символ и сопровождается \ или /. Следующее регулярное выражение (как 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 
+0

спасибо! последняя часть, похоже, не работает. Могу ли я отрицать это выражение: '^ [A-Za-z]: [\. \/\\\\]'? Так что если это не соответствует, это должно завершиться неудачно. – Alex

+0

@Alex. См. Мое редактирование. Проблема со старой версией заключалась в том, что ':' необходимо добавить в класс символов из исходного исходного выражения или каждый ':' вызовет регулярное выражение совпадение. ': (?! (? <=^[a-zA-Z]:) [\/\\\\])' является отрицанием регулярного выражения из вашего комментария (кроме '.', вы действительно хотите 'C: .test' должен быть действительным?). –

+0

Нет, но я добавил точку в списке по ошибке :) Еще раз спасибо: P – Alex

1

Если это для файлов на сервере, это то, что realpath для. Он разрешит ссылки на . и .. и проверьте, существует ли файл на этом пути. Если файл не существует, он возвращает false, если он существует, он возвращает новый путь.