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?

War es hilfreich?

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:
    1. ... 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 des class Attribut übereinstimmen.
    2. ... >)(.*)<\/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.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top