2008-09-02 17 views
6

Oye, entonces lo que quiero hacer es enganchar el contenido para el primer párrafo. La cadena $blog_post contiene una gran cantidad de párrafos en el siguiente formato:¿Cómo captar el contenido de las etiquetas HTML?

<p>Paragraph 1</p><p>Paragraph 2</p><p>Paragraph 3</p> 

El problema que estoy corriendo a decir que estoy escribiendo una expresión regular para agarrar todo lo que entre la primera <p> etiqueta y el primer cierre </p> etiqueta. Sin embargo, está tomando la primera etiqueta <p> y la última cerrando la etiqueta </p> que me da como resultado que agarro 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; 

Respuesta

18

Bueno, sysrqb le permitirá hacer coincidir nada en el primer párrafo suponiendo que no hay otro html en el párrafo. Es posible que desee algo más parecido a este

<p>.*?</p> 

La colocación del ? después de su * hace que no sea codicioso, lo que significa que sólo coincidirá tan poco texto como sea necesario antes de hacer coincidir la </p>.

1

Probablemente sería más fácil y rápido de usar strpos() para encontrar la posición de la primera

<p> 

y la primera

</p> 

luego use 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 más rápido ... su expresión regular compleja grande en la pregunta me confundió ...

6

Si usa preg_match, use "U" para que no sea codicioso.

preg_match("/<p>(.*)<\/p>/U", $blog_post, &$matches); 

$matches[1] contendrá el primer párrafo.

0

El uso de expresiones regulares para el análisis html nunca es la solución correcta. Deberías usar XPATH para este caso en 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]'); 
Cuestiones relacionadas