Preg_match bir yorumladı, multi-line (freespace) regex Passing

4 Cevap php

Ben biraz uzun olmak sonuna kadar gidiyor bir regex var ve onu çok daha kolay birden çok hatları üzerinden sahip olmak okumak için yapmak istiyorum.

Bu çalıştı ama sadece 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 için yukarıdaki biçimde bir regex geçmek için bir yol var mı?

4 Cevap

Sen genişletilmiş sözdizimi kullanabilirsiniz:

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

Tamam, burada bir çözüm:

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

Anahtar yorumlarınıza boşluk önemsiz kılmıştır başında (?x) olduğunu.

Bu başlangıç ​​ve bitiş tırnak ve başlangıç ​​ve arasında hiçbir boşluk var olduğunu da önemlidir regex sonu.

Bu gibi benim ilk denemem hataları verdi:

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

Ne Konrad said aynı zamanda çalışır ve başında (?x) yapışmasını biraz daha kolay geliyor.

(?# Your comment here)
: PHP Yorum sözdizimi bu gibi görünüyor

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

Daha fazla bilgi için PHP Regular Expression Syntax Reference bakın

Mark onun örnek gösterir gibi de PCRE_EXTENDED (veya 'x') Pattern Modifier kullanabilirsiniz.

Evet, /x Pattern Modifier ekleyebilirsiniz.

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.

Örnek için bu deneyin:

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