RegEx Problem - Inhalt des Tags mit bestimmten Klasse abrufen - preg_match (_all)
-
16-09-2019 - |
Frage
Ich muss mit bestimmten Klasse Inhalt <p>
Tag abzurufen. Klasse könnte simplecomment
oder comment
...
Also schrieb ich den folgenden Code
preg_match("|(<p class=\"(simple)?comment(.*)?\">)(.*)<\/p>|ism", $fcon, $desc);
Leider ist es gibt nichts zurück. Allerdings, wenn ich Tag endende Teil (<\/p>
) entfernen funktioniert es irgendwie, die Zeichenfolge returing, die zu lang ist (von Tag Anfang bis zum Ende des Dokuments) ...
Was ist mit meinem regulären Ausdruck falsch ist?
Lösung
Versuchen Sie, einen dom-Parser wie http://simplehtmldom.sourceforge.net/
Wenn ich lese den Beispielcode auf simplehtmldom der Homepage korrekt Sie könnte so etwas tun:
$html->find('div.simplecomment', 0)->innertext = '';
Andere Tipps
Die schnelle Lösung ist hier wie folgt vor:
'|(<p class="(simple)?comment[^"]*">)((?:[^<]+|(?!</p>).)*)</p>|is'
Änderungen:
- Das Konstrukt
(.*)
wird einfach blind alles passen, die von der Arbeit Ihres regulären Ausdruck stoppt, also hat ich diese Instanzen vollständig mit strengen Einstimmungen ersetzt:- ...
comment(.*)?
... - das wird im Grunde alles oder nichts, entspricht. Ich ersetzte dies mit[^"]*
da diese Null übereinstimmen oder mehr Nicht-"
Zeichen (im Grunde wird es auf den Schluss"
Charakter desclass
Attribut übereinstimmen. - ...
>)(.*)<\/p>
... - wieder, wird dies zu viel passen. Ich habe es mit einem effizienten Muster ersetzt, die alle nicht-<
Zeichen passen auf, und sobald es eine<
trifft wird es prüfen, ob es durch</p>
folgt. Wenn ja, wird es aufhören passende (da wir am Ende des<p>
Tages sind), sonst wird es weiter.
- ...
- Ich entfernte die
m
Flagge, da es keine Verwendung in diesem regulären Ausdruck hat.
Aber es wird nicht zuverlässig sein (man stelle sich <p class="comment">...<p>...</p></p>
, es wird <p class="comment">...<p>...</p>
übereinstimmen).
Um es zuverlässig zu machen, werden Sie rekursive reguläre Ausdrücke verwenden müssen, oder (noch besser), um ein HTML-Parser (oder XML, wenn es XHTML ist Sie zu tun haben.) Es gibt auch Bibliotheken gibt, die ungültige HTML umgehen kann " richtig“(wie Browser.)