Le passage d'un commentée, multi-ligne (espace libre) regex pour preg_match

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

  •  09-06-2019
  •  | 
  •  

Question

J'ai une regex qui va finir par être un peu long et que ça serait beaucoup plus facile à lire pour l'avoir sur plusieurs lignes.

J'ai essayé ceci mais ça 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
);

Est qu'il y a moyen de passer d'une expression régulière dans le formulaire ci-dessus pour preg_match?

Était-ce utile?

La solution

Vous pouvez utiliser la syntaxe étendue:

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

Autres conseils

Oui, vous pouvez ajouter le /x Modèle Modificateur.

Cette option désactive supplémentaires la fonctionnalité de PCRE qui est incompatible avec Perl.Un anti-slash dans un modèle qui est suivie par un lettre qui n'a pas de signification particulière provoque une erreur, donc la réservation de ces combinaisons pour une expansion future.Par par défaut, comme en Perl, une barre oblique inverse suivi d'une lettre avec n ° spécial le sens est traité comme un littéral.Il y sont à l'heure actuelle pas d'autres fonctions contrôlé par ce modificateur.

Pour votre exemple, essayez ceci:

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);
  • Vous devez ajouter des séparateurs:le premier caractère de la regex sera utilisé pour indiquer la fin du motif.
  • Vous devez ajouter le " x " en drapeau.Cela a le même effet que de mettre (?x) au début, mais c'est plus lisible à mon humble avis.

OK, voici une solution:

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

La clé est (?x) au début, ce qui rend les espaces négligeable et permet d'émettre des commentaires.

Il est également important qu'il n'y a pas d'espace entre le début et la fin des citations et des le début et la fin de la regex.

Ma première tentative, comme cela a donné des erreurs:

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

Ce Konrad a dit aussi des œuvres et se sent un peu plus facile que de coller (?x) au début.

En PHP, le commentaire de la syntaxe ressemble à ceci:

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

Pour plus d'informations, voir le PHP Syntaxe d'Expression Régulière de Référence

Vous pouvez également utiliser le PCRE_EXTENDED (ou "x") Modèle Modificateur en tant que Marque de montre dans son exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top