Передача закомментированного многострочного (свободного пространства) регулярного выражения в preg_match
Вопрос
У меня есть регулярное выражение, которое в конечном итоге окажется немного длинным, и его будет намного легче читать, если оно будет состоять из нескольких строк.
Я попробовал это, но меня просто стошнит.
preg_match(
'^J[0-9]{7}:\s+
(.*?) #Extract the Transaction Start Date msg
\s+J[0-9]{7}:\s+Project\sname:\s+
(.*?) #Extract the Project Name
\s+J[0-9]{7}:\s+Job\sname:\s+
(.*?) #Extract the Job Name
\s+J[0-9]{7}:\s+',
$this->getResultVar('FullMessage'),
$atmp
);
Есть ли способ передать регулярное выражение в приведенной выше форме в preg_match?
Решение
Вы можете использовать расширенный синтаксис:
preg_match("/
test
/x", $foo, $bar);
Другие советы
Да, вы можете добавить /x
Модификатор узора.
Этот модификатор включает дополнительную функциональность PCRE, которая несовместима с Perl.Любая обратная черта в шаблоне, за которой следует буква, которая не имеет особого значения, вызывает ошибку, что приводит к тому, что эти комбинации для будущего расширения.По умолчанию, как и в Perl, обратная черта, за которой следует буква без особого значения, рассматривается как буквальная.В настоящее время нет других функций, контролируемых этим модификатором.
Для вашего примера попробуйте следующее:
preg_match('/
^J[0-9]{7}:\s+
(.*?) #Extract the Transaction Start Date msg
\s+J[0-9]{7}:\s+Project\sname:\s+
(.*?) #Extract the Project Name
\s+J[0-9]{7}:\s+Job\sname:\s+
(.*?) #Extract the Job Name
\s+J[0-9]{7}:\s+
/x', $this->getResultVar('FullMessage'), $atmp);
- Вам следует добавить разделители:первый символ регулярного выражения будет использоваться для обозначения конца шаблона.
- Вам следует добавить флаг «x».Это дает тот же результат, что и установка (?x) в начале, но, по моему мнению, это более читабельно.
Хорошо, вот решение:
preg_match(
'/(?x)^J[0-9]{7}:\s+
(.*?) #Extract the Transaction Start Date msg
\s+J[0-9]{7}:\s+Project\sname:\s+
(.*?) #Extract the Project Name
\s+J[0-9]{7}:\s+Job\sname:\s+
(.*?) #Extract the Job Name
\s+J[0-9]{7}:\s+/'
, $this->getResultVar('FullMessage'), $atmp);
Ключ (?Икс) в начале, что делает пробелы незначительными и допускает комментарии.
Также важно, чтобы между начальными и конечными кавычками, а также началом и концом регулярного выражения не было пробелов.
Моя первая попытка, подобная этой, дала ошибки:
preg_match('
/(?x)^J[0-9]{7}:\s+
(.*?) #Extract the Transaction Start Date msg
\s+J[0-9]{7}:\s+Project\sname:\s+
(.*?) #Extract the Project Name
\s+J[0-9]{7}:\s+Job\sname:\s+
(.*?) #Extract the Job Name
\s+J[0-9]{7}:\s+/
', $this->getResultVar('FullMessage'), $atmp);
Что Конрад сказал также работает и ощущается немного проще, чем приклеивание (?Икс) в начале.
В PHP синтаксис комментариев выглядит следующим образом:
(?# Your comment here)
preg_match('
^J[0-9]{7}:\s+
(.*?) (?#Extract the Transaction Start Date msg)
\s+J[0-9]{7}:\s+Project\sname:\s+
(.*?) (?#Extract the Project Name)
\s+J[0-9]{7}:\s+Job\sname:\s+
(.*?) (?#Extract the Job Name)
\s+J[0-9]{7}:\s+
', $this->getResultVar('FullMessage'), $atmp);
Для получения дополнительной информации см. Справочник по синтаксису регулярных выражений PHP
Вы также можете использовать PCRE_EXTENDED (или «x») Модификатор узора как показывает Марк на своем примере.