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

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

Я пробовал это, но это просто barfs.

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?

Ответы [ 5 ]

5 голосов
/ 22 августа 2008

Вы можете использовать расширенный синтаксис:

preg_match("/
    test
/x", $foo, $bar);
3 голосов
/ 22 августа 2008

Да, вы можете добавить /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);
1 голос
/ 22 августа 2008
  • Вы должны добавить разделители: первый символ регулярного выражения будет использоваться для обозначения конца шаблона.
  • Вы должны добавить флаг 'x'. Результат тот же, что и в начале (? X), но imho более читабелен.
1 голос
/ 22 августа 2008

ОК, вот решение:

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);

Ключ (? 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);

Что сказал Конрад также работает и чувствует себя немного легче, чем вставлять (? X) в начале.

0 голосов
/ 22 августа 2008

В 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') Модификатор шаблона , как показывает Марк в своем примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...