Pergunta

Ei, então, o que eu quero fazer é prender o conteúdo do primeiro parágrafo.A seqüência de caracteres $blog_post contém um monte de parágrafos no seguinte formato:

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

O problema que eu tenho é que eu estou escrevendo uma regex para pegar tudo, entre o primeiro <p> marca e o primeiro encerramento </p> etiqueta.No entanto, é agarrar o primeiro <p> a tag e a última fechar </p> tag o que resulta em me agarrar tudo.

Aqui é o meu código atual:

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

Solução

Bem, sysrqb vai deixar você combinar qualquer coisa no primeiro parágrafo, supondo que não há nenhuma outra html no parágrafo.Você pode querer algo mais parecido com isto

<p>.*?</p>

Colocar o ? depois de sua * torna não-ganancioso, o que significa que só combinar com tão pouco texto conforme necessário antes de correspondência a </p>.

Outras dicas

Se você usar preg_match, use o "U" sinalizador para torná-lo onu-gananciosos.

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

$matches[1] então conterá o primeiro parágrafo.

Provavelmente seria mais fácil e rápido de usar strpos() para localizar a posição do primeiro

 <p>

e o primeiro

</p>

em seguida, use substr() para extrair o parágrafo.

 $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: Na verdade, a regex em outras respostas, será mais fácil e mais rápido...seu grande complexo de regex na pergunta me confundiu...

Usando Expressões Regulares para análise de html nunca é a solução ideal.Você deve estar usando XPATH para este caso em 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top