Come catturare il contenuto dei tag HTML?
-
09-06-2019 - |
Domanda
Ehi, quindi quello che voglio fare è catturare il contenuto del primo paragrafo.La stringa $blog_post
contiene molti paragrafi nel seguente formato:
<p>Paragraph 1</p><p>Paragraph 2</p><p>Paragraph 3</p>
Il problema che sto riscontrando è che sto scrivendo una regex per catturare tutto tra il primo <p>
tag e la prima chiusura </p>
etichetta.Tuttavia, sta afferrando il primo <p>
tag e il scorso chiusura </p>
tag che mi fa prendere tutto.
Ecco il mio codice attuale:
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;
Soluzione
Bene, sysrqb ti permetterà di abbinare qualsiasi cosa nel primo paragrafo assumendo che non ci sia altro html nel paragrafo.Potresti volere qualcosa di più simile a questo
<p>.*?</p>
Posizionando il ?
dopo il tuo *
lo rende non avido, il che significa che corrisponderà solo al testo necessario prima di abbinare il file </p>
.
Altri suggerimenti
Se usi preg_match
, Usa il "U" bandiera per renderlo non-avido.
preg_match("/<p>(.*)<\/p>/U", $blog_post, &$matches);
$matches[1]
conterrà quindi il primo paragrafo.
Probabilmente sarebbe più semplice e veloce da usare strpos() per trovare la posizione del primo
<p>
e prima
</p>
quindi utilizzare sottostr() per estrarre il paragrafo.
$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>'));
Modificare: In realtà la regex nelle risposte degli altri sarà più semplice e veloce...la tua grande e complessa espressione regolare nella domanda mi ha confuso ...
L'uso delle espressioni regolari per l'analisi HTML non è mai la soluzione giusta.Dovresti utilizzare XPATH per questo caso particolare:
$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]');