2015-10-20 2 views
1

Мне нужно проверить текстовую запись пользователя для каталога на основе Windows, нет сортировщика каталогов, это просто текстовое поле.PHP Regex для Windows Directory - preg_match

Я написал следующее Regex с помощью http://regex101.com/, которая работает должным образом для моих потребностей:

^[a-zA-Z]\:[\/,\\].{1,} 

который будет соответствовать, например, следующие каталоги в онлайн-инструмент:

C:/Users/Charlie/Dropbox 
D:/Users/Bob/Quotes 
F:/Quotes 

Проблема заключается в том, при использовании в моем приложении preg_match не соответствует ни одному из приведенных выше. Он не возвращает true, а preg_last_error() возвращает 0, который также указывает значение ложного возврата.

Точный код используется:

if(preg_match('/^[a-zA-Z]\:[\/,\\].{1,}/', $directory)) { } 

Любая помощь очень ценится.

+0

Что в $ каталоге? – Chris

+0

@Chris Любой из приведенных выше каталогов, ни одна из них не работает. Выделили их на стороне сервера (непосредственно перед 'preg_match'), и они печатаются точно так, как ожидалось. – Charlie

+0

попытайтесь определить выходной массив и напечатать его. Preg_match ("/^[a-zA-Z] \: [\ /, \\]. {1,} /", $ directory, $ output_array); – Chris

ответ

1

Вы должны использовать четырехкратный обратный косые черты, чтобы соответствовать буквальной обратному косой черте здесь:

if(preg_match('/^[a-zA-Z]\:[\/,\\\\].{1,}/', 'C:/Users/Charlie/Dropbox')) { 
//        ^^^^ 

IDEONE demo См

В противном случае обратный слэш просто уйти от ] и губит регулярки класса символов.

Обратите внимание, что вместо {1,} вы можете просто использовать + квантор, что означает 1 или более вхождений и что вам не нужно, чтобы избежать толстой кишки.

Я также не понимаю, почему у вас есть запятая в классе символов, символ рассматривается как буквальный. Я думаю, вы просто хотите найти либо \, либо / с [\/,\\\]? Затем все регулярное выражение будет выглядеть

'/^[a-zA-Z]:[\/\\\\].+/' 

См another demo

+1

Это сделало трюк, спасибо! Хотя стоит отметить, что на самом деле мне пришлось использовать четырехкратную обратную косую черту, тройка, похоже, каким-то образом избегает последней цитаты, оставив остальную часть файла в кавычках. Я теперь заменил 'более одного' на' + 'квантификатор. Comma предназначалась как разделитель между двумя символами да, понимаете, что теперь это неверно, обновили это сейчас. Я тестировал его, и все работает отлично, спасибо снова. – Charlie

+1

Я нашел [сообщение, объясняющее, что как 3, так и 4 обратные слэши могут использоваться для соответствия буквальному '' \ ''] (http://stackoverflow.com/a/15369828/3832970), но он действительно рекомендует использовать 4 обратных слэша для соответствуют буквальному '' \ ''. Я соответствующим образом обновил ответ. Я думаю, что три выхода работают так же, как и в Python - когда escape-последовательность не может быть интерпретирована как таковая, обратная косая черта рассматривается как литерал. Возможно, не во всех случаях - например, у вас. –

Смежные вопросы