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;
È stato utile?

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]');
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top