Регулярное выражение с восклицательными знаками с обеих сторон ('!\D!')

Я видел регулярное выражение '!\d!' внутри функции PHP preg_match. Что это за черт?

Ответ 1

Из Документы PHP PCRE:

При использовании функций PCRE требуется, чтобы шаблон был заключен в разделители. Разделителем может быть любой небуквенный символ, не обратный слэш, символ без пробелов.

В этом случае он просто использует ! как разделитель. Часто он используется, если вы хотите использовать обычный разделитель внутри самого регулярного выражения без необходимости его избегать. В этом случае не обязательно, так как остальное регулярное выражение просто \d, но оно очень удобно для таких вещей, как проверка того, что путь содержит более трех уровней каталога. Вы можете использовать любой из:

/\/.*\/.*\/.*\/ blah blah blah /

или

!/.*/.*/.*/ blah blah blah !

Теперь они не были протестированы полностью и могут работать не так, как было объявлено, но вы должны получить общую идею, требующую минимального экранирования.

Другой пример (со страницы, связанной с выше) - проверка, начинается ли строка с маркера http://. Любой из этих двух:

/^http:\/\//
!^http://!

было бы достаточно, но второе легче понять.

Ответ 2

! используется как разделитель, \d соответствует одной цифре.

Это то же самое, что /[0-9]/