2010-06-01 15 views
5

Ésta es mycodePHP expresión regular para que coincida con un div

<?php 

/** 
* @author Joomlacoders 
* @copyright 2010 
*/ 
    $url="http://urlchecker.net/html/demo.html"; 

    $innerHtml=file_get_contents($url); 

    //echo $innerHtml; 
    preg_match_all("{\<div id='news-id-.*d'\>(.*)\</div\>}",$innerHtml,$matches); 

      //<div id='news-id-160346'>    

    var_dump($matches); 

?> 

quiero encontrar todo el contenido en div id = 'noticias-id-160346'. Por favor me ayude a

Respuesta

6

Use an HTML parser. NOT regular expressions.

El problema con las expresiones regulares es que ellos no pueden igualar las estructuras anidadas. Asumiendo que su expresión regular debe coincidir con una sola <div> y su etiqueta de cierre, no hay manera para que coincida correctamente esta entrada:

<div id="a"> 
    <div id="b"> 
     Foo 
    </div> 
</div> 
<div id="c"> 
    Bar 
</div> 

Porque si la expresión regular es codicioso, que coincidirá con los dos divs superiores, y si es ungreedy , no coincidirá con la etiqueta final correcta.

Por lo tanto, debe usar un analizador HTML. Con PHP, DOMDocument::loadHTML o DOMDocument::loadHTMLFile cada uno hace un buen trabajo. (Puede "ignorar" de forma segura las advertencias que genera: solo son errores de marcado, y el objeto generado DOMDocument debería estar más o menos bien.)

Dado que PHP getElementById es difícil de poner a trabajar, puede usar DOMXPath para el mismo propósito:

<?php 

$url = "http://urlchecker.net/html/demo.html"; 

$d = new DOMDocument(); 
$d->loadHTMLFile($url); 

$xpath = new DOMXPath($d); 
$myNews = $xpath->query('//@id="news-id-160346"')->item(0); 

?> 
+0

Hola tenían probar todas respuesta, pero no tiene éxito Advertencia: DOMDocument :: loadHTMLFile() [domdocument.loadhtmlfile]: etiqueta de cierre inesperado: una en http://urlchecker.net/html/demo.html, la línea: 26 en /home/urlcheck/public_html/html/test.php en la línea 10 – Thoman

+1

@Thoman: en realidad ha tenido éxito. loadHTMLFile simplemente te dice los problemas que encontró durante el análisis. Puede cerrarlo con el operador '@': '@ $ d-> cargarHTMLFile ($ url);' – zneak

+0

Lo intento pero este código no coincide con todo el contenido en id = 'news-id-160346' – Thoman

0

Utilizar un analizador como otros sugirieron.

O probar esta expresión regular:

preg_match_all("#<div [^>]*id=['\"]news-id-\\d+['\"](.*?)</div>#", $innerHtml, $matches); 
print_r($matches); 

comprobar la salida de la declaración print_rpara entender por qué la expresión regular no se considera como la herramienta adecuada para el análisis de HTML.

+0

No partido, por favor, corrige – Thoman

+0

@Thoman Lee mi última línea de nuevo. No coincidirá - ese es el punto completo - no se puede arreglar. – Amarghosh

+0

¿Le interesa explicar por qué fue votado negativamente? – Amarghosh

Cuestiones relacionadas