Comunidad de diseño web y desarrollo en internet online

Expresión regular en PHP para extraer patrones a un array

Citar            
MensajeEscrito el 23 Nov 2013 06:26 pm
Hola,
He estudiado detenidamente el manual de php (http://www.php.net/manual/es/regexp.introduction.php) pero no consigo averiguar lo que necesito.

Necesito extraer cualquier texto de un HTML que esté dentro de un enlace (<a></a>) y el cual contenga una determinada clase (class="clase").

Ejemplo de un HTML:

Código PHP :

$html = '
algún texto html
<a atributos class="clase1" atributos>CAPTURAR ESTO</a>
algún texto html
<a atributos class="clase2" atributos>NO CAPTURAR ESTO</a>
algún texto html
<a atributos class="clase1" atributos>CAPTURAR ESTO</a>
algún texto html';


Así, necesito una expresión regular que devuelva un array (esto sería con preg_match, si no me equivoco) que contenga todos los textos que hay dentro de las etiquetas <a> que tengan la clase1, por ejemplo.
Y este es el código que estoy intentando:

Código PHP :

$patron = '/<a.*?class="clase1".*?>.*?<\/a>/i';
if( preg_match($patron, $html, $arr_result) ){
   echo '¡Se han encontrado patrones!';
   echo '<pre>';
   print_r($arr);
   echo '<pre>';
}else{
   echo '¡No se han encontrado patrones!';
}


El resultado que me está devolviendo es:
¡Se han encontrado patrones!
Array
(
[0] => CAPTURAR ESTO 1
)

Pero debería devolver dos patrones... no uno...
¿Qué ocurre? ¿Alguien puede echarme una mano? Ya no sé qué hacer...

Por anatman

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 23 Nov 2013 08:39 pm
No es preg_match() sino preg_match_all() porque preg_match() se detiene en la primera coincidencia, mientras que preg_match_all() continua hasta el final del texto objetivo.

A propósito: La expresión regular que quieres, quedaría mejor así:

Código :

/<a.*?class="clase1".*?>(.*?)<\/a>/i

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 24 Nov 2013 09:20 am
Muchas gracias DriverOp!!!

He añadido un retoque a la expresión y ésta es la solución final:

Código PHP :

preg_match_all('/<a[^>]+class="clase1"[^>]+>(.*?)<\/a>/i', $html, $arr_result)


He sustituido el ".*?" por "[^>]+" porque cuando el $html contenía un codigo sin saltos de línea no cogía bien los patrones. Y con este retoque, ahora va todo bien.

Un saludo.
Y gracias otra vez DriverOp!

Por anatman

1 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.