¿Cómo capturar el contenido de las etiquetas HTML?
-
09-06-2019 - |
Pregunta
Oye, lo que quiero hacer es capturar el contenido del primer párrafo.La cuerda $blog_post
Contiene muchos párrafos en el siguiente formato:
<p>Paragraph 1</p><p>Paragraph 2</p><p>Paragraph 3</p>
El problema con el que me encuentro es que estoy escribiendo una expresión regular para capturar todo lo que hay entre la primera <p>
etiqueta y el primer cierre </p>
etiqueta.Sin embargo, está acaparando la primera <p>
etiqueta y el último clausura </p>
etiqueta que me hace agarrar todo.
Aquí está mi código actual:
if (preg_match("/[\\s]*<p>[\\s]*(?<firstparagraph>[\\s\\S]+)[\\s]*<\\/p>[\\s\\S]*/",$blog_post,$blog_paragraph))
echo "<p>" . $blog_paragraph["firstparagraph"] . "</p>";
else
echo $blog_post;
Solución
Bueno, sysrqb te permitirá hacer coincidir cualquier cosa en el primer párrafo suponiendo que no haya otro html en el párrafo.Quizás quieras algo más como esto.
<p>.*?</p>
Colocando el ?
despues de ti *
lo hace no codicioso, lo que significa que solo coincidirá con la menor cantidad de texto necesario antes de hacer coincidir el </p>
.
Otros consejos
Si utiliza preg_match
, utilizar el "U" flag para que no sea codicioso.
preg_match("/<p>(.*)<\/p>/U", $blog_post, &$matches);
$matches[1]
entonces contendrá el primer párrafo.
Probablemente sería más fácil y rápido de usar. strpos() para encontrar la posición del primero
<p>
y primero
</p>
entonces usa substr() para extraer el párrafo.
$paragraph_start = strpos($blog_post, '<p>');
$paragraph_end = strpos($blog_post, '</p>', $paragraph_start);
$paragraph = substr($blog_post, $paragraph_start + strlen('<p>'), $paragraph_end - $paragraph_start - strlen('<p>'));
Editar: En realidad, la expresión regular en las respuestas de los demás será más fácil y rápida...tu gran expresión regular compleja en la pregunta me confundió...
Usar expresiones regulares para el análisis de HTML nunca es la solución adecuada.Deberías utilizar XPATH para este caso particular:
$string = <<<XML
<a>
<b>
<c>texto</c>
<c>cosas</c>
</b>
<d>
<c>código</c>
</d>
</a>
XML;
$xml = new SimpleXMLElement($string);
/* Busca <a><b><c> */
$resultado = $xml->xpath('//p[1]');