Pasar una expresión regular comentada de varias líneas (espacio libre) a preg_match

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Tengo una expresión regular que terminará siendo un poco larga y sería mucho más fácil de leer si estuviera en varias líneas.

Intenté esto pero simplemente vomita.

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

¿Hay alguna forma de pasar una expresión regular en el formulario anterior a preg_match?

¿Fue útil?

Solución

Puede utilizar la sintaxis extendida:

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

Otros consejos

Sí, puedes agregar el /x Modificador de patrón.

Este modificador enciende la funcionalidad adicional de PCRE que es incompatible con Perl.Cualquier barra inalentable en un patrón que sea seguido por una carta que no tiene un significado especial causa un error, reservando así estas combinaciones para una futura expansión.Por defecto, como en Perl, una barra invertida seguida de una carta sin significado especial se trata como un literal.En la actualidad no hay otras características controladas por este modificador.

Para su ejemplo, intente esto:

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);
  • Deberías agregar delimitadores:el primer carácter de la expresión regular se utilizará para indicar el final del patrón.
  • Deberías agregar la bandera 'x'.Esto tiene el mismo resultado que poner (?x) al principio, pero es más legible en mi humilde opinión.

Bien, aquí tienes una solución:

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 clave es (?X) al principio, lo que hace que los espacios en blanco sean insignificantes y permite comentarios.

También es importante que no haya espacios en blanco entre las comillas iniciales y finales y el inicio y el final de la expresión regular.

Mi primer intento como este dio errores:

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

Qué Konrad dijo también funciona y se siente un poco más fácil que pegar (?X) al principio.

En PHP la sintaxis de los comentarios se ve así:

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

Para más información consulte el Referencia de sintaxis de expresiones regulares de PHP

También puedes usar PCRE_EXTENDED (o 'x') Modificador de patrón como muestra Marcos en su ejemplo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top