Сведения о вопросе

Ayrat

14:00, 17th August, 2020

Теги

php   regex    

Прохождение с комментарием, мульти-линии (свободного пространства) regex для функции preg_match

Просмотров: 413   Ответов: 5

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

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

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

Есть ли способ передать regex в приведенной выше форме preg_match?



  Сведения об ответе

#hash

20:31, 21st August, 2020

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

preg_match("/
    test
/x", $foo, $bar);


  Сведения об ответе

dump

21:14, 19th August, 2020

Да, вы можете добавить модификатор шаблона /x .

Этот модификатор включает дополнительные функции функциональность PCRE то есть несовместимо с Perl. Любая обратная косая черта в шаблоне, за которым следует a письмо, не имеющее особого значения вызывает ошибку, таким образом резервируя их комбинации для будущего расширения. Около по умолчанию, как и в 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);


  Сведения об ответе

+-*/

16:50, 26th August, 2020

Хорошо, вот решение:

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) в начале, что делает whitespace незначительным и позволяет комментарии.

Также важно, чтобы между начальными и конечными кавычками и началом & конца regex не было whitespace.

Моя первая попытка, как это дало ошибки:

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) в самом начале.


  Сведения об ответе

crush

23:14, 28th August, 2020

  • Вы должны добавить разделители: первый символ regex будет использоваться для обозначения конца шаблона.
  • Вы должны добавить флаг 'x'. Это имеет тот же результат, что и положить (?x) в начале, но это более читабельно imho.


  Сведения об ответе

SKY

05:25, 2nd August, 2020

В 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'), как показано в Примере Марка.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться