2010-08-30 15 views
14

que he siguiente escenario:PHP Regex encontrar texto entre añadido encargo etiquetas HTML

Tienes un archivo de plantilla HTML que será utilizado para mailing.

Aquí está un ejemplo reducida:

<table> 
<tr> 
<td>Heading 1</td> 
<td>heading 2</td> 
</tr> 
<PRODUCT_LIST> 
<tr> 
<td>Value 1</td> 
<td>Value 2</td> 
</tr> 
</PRODUCT_LIST> 
</table> 

Todo lo que necesito hacer es obtener el código HTML dentro <PRODUCT_LIST> y luego repetir ese código tantas veces como productos que tengo en una matriz.

¿Cuál sería el código PHP Regex correcto para obtener/reemplazar esta Lista?

Gracias!

+1

Técnicamente, eso no es una etiqueta HTML; esa es una etiqueta XHTML. O, mejor dicho, es una etiqueta XML en un documento XHTML que también usa otro espacio de nombres personalizado. Ver: http://www.w3.org/TR/xhtml1/normative.html#well-formed –

Respuesta

30

Suponiendo <PRODUCT_LIST> etiquetas nunca pueden anidar

preg_match_all('/<PRODUCT_LIST>(.*?)<\/PRODUCT_LIST>/s', $html, $matches); 

//HTML array in $matches[1] 
print_r($matches[1]); 
+0

Las etiquetas nunca serán anidadas, pero usando este código obtengo dos coincidencias vacías ... array (2) { [0] => array (0) {} [1] => array (0) {} } – Bathan

+0

Al utilizar el fragmento de HTML que pegó, obtengo una matriz con solo un elemento que contiene el código HTML dentro de las etiquetas PRODUCT_LIST. Tal vez deberías publicar una muestra HTML más completa. – MooGoo

+0

Gracias amigo! Tuve un error tipográfico en el HTML. Esto funciona bien – Bathan

8

Use Simple HTML DOM Parser. Es fácil de entender y usar

$html = str_get_html($content); 
$el = $html->find('PRODUCT_LIST', 0); 
$innertext = $el->innertext; 
3

Utilice esta función. Devolverá todos los valores encontrados como una matriz.

<?php 
function get_all_string_between($string, $start, $end) 
{ 
    $result = array(); 
    $string = " ".$string; 
    $offset = 0; 
    while(true) 
    { 
     $ini = strpos($string,$start,$offset); 
     if ($ini == 0) 
      break; 
     $ini += strlen($start); 
     $len = strpos($string,$end,$ini) - $ini; 
     $result[] = substr($string,$ini,$len); 
     $offset = $ini+$len; 
    } 
    return $result; 
} 

$result = get_all_string_between($input_string, '<PRODUCT_LIST>', '</PRODUCT_LIST>'); 
+1

El HTML no es regular. Algo como esto funcionará para el sencillo ejemplo proporcionado, pero no va a trabajar por algo con etiquetas anidadas (''). Por lo tanto, no es una buena solución genérica (no -1, ya que se ajusta a las necesidades del ejemplo proporcionado) ... La solución mejor y más genérica sería usar un analizador DOM (SimpleXML, DomDocument, SimpleHtmlDom, etc.) ... – ircmaxell

+0

@ircmaxell, sí, estoy de acuerdo. Pero a medida que especifica sus ** etiquetas **, puede ser regular. Solo otra forma de resolverlo. – shamittomar

+0

No digo que no se pueda hacer o que sea "malo" (de lo contrario, tendría '-1') ... Solo digo que no es una solución genérica. Está perfectamente bien siempre que el alcance del problema se ajuste a las limitaciones de la solución. Solo estaba señalando las limitaciones (para que el alcance del problema se pueda evaluar mejor) ... – ircmaxell

0

prueba este regular expression en preg match all function

<PRODUCT_LIST>(.*?)<\/PRODUCT_LIST> 
2

que el anterior está bien, pero con el rendimiento es realmente horrible si se puede usar PHP 5 puedes usar un objeto DOM como este:

 <?php 
     function getTextBetweenTags($tag, $html, $strict=0) 
    { 
    /*** a new dom object ***/ 
    $dom = new domDocument; 

    /*** load the html into the object ***/ 
    if($strict==1) 
    { 
     $dom->loadXML($html); 
    } 
    else 
    { 
     $dom->loadHTML($html); 
    } 

    /*** discard white space ***/ 
    $dom->preserveWhiteSpace = false; 

    /*** the tag by its tag name ***/ 
    $content = $dom->getElementsByTagname($tag); 

    /*** the array to return ***/ 
    $out = array(); 
    foreach ($content as $item) 
    { 
     /*** add node value to the out array ***/ 
     $out[] = $item->nodeValue; 
    } 
    /*** return the results ***/ 
    return $out; 
} 
?> 

y después de agregar esta función sólo se puede utilizar como:

$content = getTextBetweenTags('PRODUCT_LIST', $your_html); 

foreach($content as $item) 
{ 
    echo $item.'<br />'; 
} 
?> 

sí, acabo de aprender esto hoy. no use preg para html con php5

Cuestiones relacionadas