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;
¿Fue útil?

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]');
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top