/ / Código fuente de la página web de análisis con expresiones regulares - php, regex, html-parsing

Análisis del código fuente de la página web con expresiones regulares - php, regex, html-parsing

No puedo encontrar la expresión regular que necesito para analizar lo siguiente.

<div id="MustBeInThisId">
<div class="ValueFromThisClass">
The Value I need
</div>
</div>

Como puedes ver tengo un div envoltorio con una identificación. Ese div contiene varios otros divs pero solo uno de esos divs del que necesito el valor.

Respuestas

4 para la respuesta № 1

Si está intentando extraer algunos datos de un documento HTML, no debe usar expresiones regulares.

En su lugar, debe usar un analizador DOM: están hechos exactamente para eso.


En PHP, usarías el DOMDocument clase, y su DOMDocument::loadHTML() Método, para cargar el contenido HTML.


Luego, puedes trabajar con métodos como:

Incluso puedes trabajar con DOMXpath para ejecutar consultas XPath en su contenido HTML, lo que le permitirá buscar casi cualquier cosa en él.


En tu caso, supongo que algo como esto debería hacer el truco.

En primer lugar, obtener su contenido HTML en una cadena (o usar DOMDocument::loadHTMLFile()) :

$html = <<<HTML
<p>hello</p>
<div>
<div id="MustBeInThisId">
<div class="ValueFromThisClass">
The Value I need
</div>
</div>
<div>
HTML;

Luego, cárgalo a un DOMDocument ejemplo:

$dom = new DOMDocument();
$dom->loadHTML($html);

Instanciate un DOMXPath objeto, y lo utiliza para consultar su objeto DOM:
Mi expresión XPath podría ser un poco más compleja de lo necesario ... No soy muy bueno con esos ...

$xpath = new DOMXPath($dom);
$items = $xpath->query("//div[@id="MustBeInThisId"]/div[@class="ValueFromThisClass"]");

Y, finalmente, trabajar con los resultados de esa consulta:

if ($items->length > 0) {
var_dump( trim( $items->item(0)->nodeValue ) );
}

Y aquí está tu resultado:

string "The Value I need" (length=16)

1 para la respuesta № 2

Usa algo como simplehtmldom - Hará tu vida mucho más fácil.

$html = str_get_html($source_code);
$tag = $html->find("#MustBeInThisId .ValueFromThisClass", 0);
$the_value_i_need = $tag->innertext;

0 para la respuesta № 3

Regex no puede "analizar HTML ya que HTML no es un lenguaje regular. Deberías usar DOMDocument.

Entonces obtienes buenas funciones como getElementById :)


0 para la respuesta № 4

O prueba una biblioteca de javascript como JQuery. Creo que es la forma más fácil de hacer lo que quieres.