Rolf B: PHP: finde in $content alle <p> und erweitere das 3, 6, 9 durch X

Beitrag lesen

Hallo noob-2000,

dazu solltest Du nicht strpos benutzen, sondern preg_match_all. Das bekommt eine Regex und liefert dann ein relativ kompliziertes Array mit allen Treffern.

preg_match_all("!<p[ >]|</p>!", $content, $matches, PREG_OFFSET_CAPTURE);
var_dump($matches[0]);

!<p[ >]|</p>! ist die Regex (regular expression). Die ! vorn und hinten sind Teil der Regex-Syntax; eine Regex hat Begrenzerzeichen. Das ist der von PHP verwendeten Regex-Library geschuldet. Als Begrenzer nimmt man klassisch das / Zeichen, aber weil wir auch nach / suchen wollen (in </p>), verwende ich ein anderes. Man ist da relativ frei in der Auswahl.

Der senkrechte Strich | ist ein "Oder", suche nach <p[ >] ODER </p>. Bei </p> ist es einfach, da sind keine Regex-Steuerzeichen drin, das ist einfach diese Zeichenfolge, nach der er sucht. In <p[ >] werden die eckigen Klammern verwendet, das definiert eine Menge von Zeichen, von denen eins passen soll. Hier sind's nur 2, d.h. dieser Teil der Regex trifft auf <p oder <p> zu.

Man hätte genauso gut !<p |<p>|</p>! schreiben können, das würde zum gleichen Ergebnis führen.

Weil die Regex keine Gruppen enthält (runde Klammern), gibt es pro Suchtreffer immer nur ein Ergebnis, deswegen enthält das $matches-Array nur einen Eintrag. Dieser eine Eintrag ist aber ein Array, mit einem Element pro gefundenem Treffer, und dieses Treffer-Element ist wieder ein Array mit 2 Einträgen: gefundener Text an Stelle 0, Position des Fundes an Stelle 1.

$matches[0][0][0] würde also den Text des ersten Treffers liefern, und $matches[0][0][1] dessen Anfangsposition im String. $matches[0][6][1] wäre die Position des siebten Treffers.

All das unter dem Vorbehalt, dass ein HTML Dokument etwas ist, was man mit einfachen Stringfunktionen besser nicht durchsucht. Ein Parser, der Dir ein DOM liefert, wäre eigentlich besser. Es ist in PHP nur nicht trivial, einen zu verwenden.

  • Der eingebaute DOM Parser: die DOMDocument-Klasse (Gunnar um 16:17 Uhr). Diese Klasse ist SCHEISSE. Bitte entschuldige das harte Wort, aber sie ist es. Denn sie ist auf HTML 4 stehen geblieben und schmeißt teils unsinnige Fehler bei ordentlichen HTML 5 Dokumenten. Noch schlimmer wird es, wenn Du im DOM manipulierst und daraus wieder ein HTML Dokument erzeugen willst.

  • Andere Libs wie der von Dir gefundene Parser von Gilles Paquette. Problem ist hier, dass die Integration immer nur mit Composer vorgesehen ist. Einerseits kein Wunder, Composer ist das Modulmanagementtool der PHP Welt, ähnlich NPM bei Node.js oder NUGET in der .net Welt. Aber man muss ihn halt installieren und verstehen, und man installiert ihn auf seinem Entwicklerrechner, NICHT auf dem Webserver, wo Du deine Seite hostest. Eine PHP Lib, für die man einfach ein ZIP herunterlädt und es in einen Ordner seines Webs entpackt, scheint es nicht zu geben. Keine Ahnung, ob man das per Composer irgendwie als Funktion zur Verfügung hat; wenn ich Composer sehe, winke ich immer gleich ab. Ich habe keine Lust, mich mit dem Ding zu befassen (bin aber auch kein beruflicher PHP Entwickler).

Deshalb - und nur deshalb - gebe ich Dir Tipps für Wege ohne Parser.

Rolf

--
sumpsi - posui - obstruxi