Übergabe eines kommentierten, mehrzeiligen (Freespace) Regex an preg_match

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

  •  09-06-2019
  •  | 
  •  

Frage

Ich habe einen regulären Ausdruck, der am Ende etwas lang wird und es viel einfacher machen würde, ihn zu lesen, wenn er über mehrere Zeilen verteilt wäre.

Ich habe es versucht, aber es kotzt einfach nur.

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

Gibt es eine Möglichkeit, einen regulären Ausdruck in der obigen Form an preg_match zu übergeben?

War es hilfreich?

Lösung

Sie können die erweiterte Syntax verwenden:

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

Andere Tipps

Ja, Sie können das hinzufügen /x Mustermodifikator.

Dieser Modifikator aktiviert zusätzliche Funktionen von PCRE, die mit Perl nicht kompatibel ist.Jeder Backslash in einem Muster, dem ein Buchstaben folgt, der keine besondere Bedeutung hat, verursacht einen Fehler, wodurch diese Kombinationen für die zukünftige Expansion reserviert werden.Standardmäßig wird wie in Perl ein Backslash, gefolgt von einem Brief ohne besondere Bedeutung, als wörtlich behandelt.Gegenwärtig gibt es keine anderen Funktionen, die von diesem Modifikator gesteuert werden.

Versuchen Sie für Ihr Beispiel Folgendes:

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);
  • Sie sollten Trennzeichen hinzufügen:Das erste Zeichen der Regex wird verwendet, um das Ende des Musters anzuzeigen.
  • Sie sollten die Flagge „x“ hinzufügen.Dies hat das gleiche Ergebnis wie das Einfügen von (?x) am Anfang, ist aber meiner Meinung nach besser lesbar.

OK, hier ist eine Lösung:

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

Der Schlüssel ist (?X) am Anfang, wodurch Leerzeichen unbedeutend werden und Kommentare möglich sind.

Es ist außerdem wichtig, dass zwischen den Anfangs- und Endanführungszeichen und dem Anfang und Ende der Regex kein Leerzeichen steht.

Mein erster Versuch wie dieser ergab Fehler:

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

Was sagte Konrad Funktioniert auch und fühlt sich etwas einfacher an als das Kleben (?X) am Anfang.

In PHP sieht die Kommentarsyntax so aus:

(?# 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);

Weitere Informationen finden Sie unter Referenz zur PHP-Syntax für reguläre Ausdrücke

Sie können auch PCRE_EXTENDED (oder 'x') verwenden. Mustermodifikator wie Mark in seinem Beispiel zeigt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top