У меня есть регулярное выражение, которое в конечном итоге будет немного длинным, и его будет намного легче читать, если оно будет на нескольких строках.
Я пробовал это, но это просто сбои.
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);
Хорошо, вот решение:
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') Модификатор узора, как Марк показывает в своем примере.
Да, вы можете добавить /xМодификатор узора.
This modifier turns on additional functionality of PCRE that is incompatible with Perl. Any backslash in a pattern that is followed by a letter that has no special meaning causes an error, thus reserving these combinations for future expansion. By default, as in Perl, a backslash followed by a letter with no special meaning is treated as a literal. There are at present no other features controlled by this modifier.
Для вашего примера попробуйте следующее:
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);
Интересно. Помещение тегов, разделенных знаком +, показывает их по отдельности в вопросе, а справа - комбинированный тег И.