Wie zu packen die Inhalte von HTML-tags?
-
09-06-2019 - |
Frage
Hey also was ich tun möchte, besorge die Inhalte für den ersten Absatz.String $blog_post
enthält eine Menge an Paragraphen, die im folgenden format:
<p>Paragraph 1</p><p>Paragraph 2</p><p>Paragraph 3</p>
Das problem, das ich gelaufen bin ist, dass ich Schreibe, eine regex zu greifen, alles, was zwischen dem ersten <p>
- tag und der ersten Schließung </p>
tag.Es ist jedoch packte das erste <p>
- tag und die letzten schließen </p>
- tag, die Ergebnisse in mich, packte alles ein.
Hier ist meine aktuellen code:
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;
Lösung
Gut, sysrqb lassen Sie mit etwas in dem ersten Absatz angenommen, es gibt keine andere html-Absatz.Möchten Sie vielleicht so etwas wie dieses
<p>.*?</p>
Die Platzierung die ?
nach Ihrer *
macht es nicht-gierig, was bedeutet, es passt nur so wenig text wie nötig vor dem matching der </p>
.
Andere Tipps
Wenn Sie preg_match
, verwenden Sie die "U" Flagge, um es un-gierig.
preg_match("/<p>(.*)<\/p>/U", $blog_post, &$matches);
$matches[1]
enthält dann den ersten Absatz.
Es wäre wahrscheinlich einfacher und schneller zu bedienen strpos() zu finden, die position des ersten
<p>
und erste
</p>
verwenden Sie dann substr() zum extrahieren der Absatz.
$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>'));
Edit: Tatsächlich ist die regex, die in anderen Antworten wird einfacher und schneller...Ihre große komplexe regex-in der Frage verwirrt mich...
Die Verwendung Regulärer Ausdrücke für html-parsing ist nie die richtige Lösung.Sollten Sie die Verwendung von XPATH für diesen speziellen Fall:
$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]');