Передача закомментированного многострочного (свободного пространства) регулярного выражения в preg_match

StackOverflow https://stackoverflow.com/questions/22552

  •  09-06-2019
  •  | 
  •  

Вопрос

У меня есть регулярное выражение, которое в конечном итоге окажется немного длинным, и его будет намного легче читать, если оно будет состоять из нескольких строк.

Я попробовал это, но меня просто стошнит.

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») Модификатор узора как показывает Марк на своем примере.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top