Регулярные выражения PHP - проблемы с точкой '.' символ в preg_match - PullRequest
1 голос
/ 08 марта 2012

Я пытаюсь использовать preg_match($regexp, $filename) для определения парсинга некоторых имен файлов и каталогов. В частности, учитывая строку типа «directory / subdirectory / filename.h», я хочу проверить, заканчивается ли строка в «filename.h»

Когда все литералы (например, '/' и '.') Экранированы, мой тест выглядит так:

preg_match('/filename\.h$/', ''directory\/subdirectory\/filename\.h');

Однако приведенная выше строка кода возвращает false.

Как ни странно, следующая строка кода возвращает true.

preg_match('/\.h$/', 'directory\/subdirectory\/filename\.h');

Кто-нибудь знает, почему это имеет значение true, когда регулярное выражение равно '/\.h$/', но false, когда регулярное выражение равно '/filename\.h$/'?

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

В проверяемой строке не избегайте косых черт и точек.Они обрабатываются как буквальные обратные слэши внутри строки в одинарных кавычках и поэтому не совпадают:

preg_match('/filename\.h$/', 'directory/subdirectory/filename.h');
// Matches!
1 голос
/ 08 марта 2012

Вы только должны экранировать первый аргумент (регулярное выражение).Второй аргумент - это обратный слеш буквально (потому что он заключен в одинарные кавычки).

Имея это в виду, ваш первый preg_match делает это сравнение:

directory\/subdirectory\/filename\.h
                         filename .h
                                 ^... This is why it doesn't match

Ивторой делает это:

directory\/subdirectory\/filename\.h
                                  .h  MATCH!
...