2011-05-16 9 views
8

¿Hay alguna manera de obtener múltiples grupos de captura de una expresión regular que utiliza cuantificadores? Por ejemplo, decir que tengo estos datos (simplificado de lo que tengo que hacer frente a):Múltiples grupos de captura de expresiones regulares que usan los cuantificadores

<td>Data 1</td> 
<td>data 2</td> 
<td>data 3</td> 
<td>data 4</td> 

En este momento, si escribo una expresión regular como esto:

(?:<td>(.+?)<\/td>\s*){4} 

termino con una sola grupo de captura, el último "datos 4". ¿Hay una manera de utilizar el cuantificador y terminar con 4 grupos de captura, o estoy obligado a escribir las expresiones regulares como este para conseguir lo que quiero:

<td>(.+?)<\/td>\s*<td>(.+?)<\/td>\s*<td>(.+?)<\/td>\s*<td>(.+?)<\/td> 

sí, soy muy consciente de que puedo cortar esta ejemplo simple mucho más fácil mediante programación y luego aplicar y expresiones regulares necesarias o coincidencias de patrones más simples. Los datos con los que estoy trabajando son mucho más complejos y me gustaría usar una expresión regular para manejar todo el análisis sintáctico.

+3

supongo que se perdió el último párrafo. Esta es una pregunta de "es posible algo con una expresión regular", no "cuál es la mejor manera de analizar HTML". –

+0

He eliminado mi primer comentario, pero no estoy de acuerdo en que el concepto aquí valga la pena. Regex solo sirve para analizar HTML en * muy * casos simples. Esto no es tal – lonesomeday

+2

Una vez más, esto no se trata de analizar HTML, se trata de si una expresión regular puede capturar múltiples grupos utilizando cuantificadores. Este es un ejemplo simple para ilustrar el punto. –

Respuesta

9

con PHP puede utilizar preg_match_all:

$str = '<td>Data 1</td> 
<td>data 2</td> 
<td>data 3</td> 
<td>data 4</td> 
'; 
preg_match_all('/(?:<td>(.+?)<\/td>\s*)/', $str, $m); 
print_r($m); 

de salida:

Array 
(
    [0] => Array 
     (
      [0] => <td>Data 1</td> 

      [1] => <td>data 2</td> 

      [2] => <td>data 3</td> 

      [3] => <td>data 4</td> 

     ) 

    [1] => Array 
     (
      [0] => Data 1 
      [1] => data 2 
      [2] => data 3 
      [3] => data 4 
     ) 

) 
+0

Volví a subir esto porque una versión más compleja de esto es lo que ya estoy haciendo. Sin embargo, no responde mi pregunta sobre los grupos de captura de expresiones regulares con cuantificadores. Como dije en el contenido original de la pregunta, me gustaría evitar las respuestas programáticas a esta pregunta y me gustaría saber si es posible desde una perspectiva regex pura. –

+0

@Tony Lukasavage: Gracias. Desafortunadamente, como dijo Tim Pietzcker en un comentario, no es posible en php. – Toto

Cuestiones relacionadas