Como agarrar o conteúdo das tags de HTML?
-
09-06-2019 - |
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;
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]');