Regex: Match-html-tag nur, wenn es mit einer bestimmten Klassen-id
Match ein html-tag mit Hilfe von perl regex in php.
Wollen den tag zu entsprechen, wenn es enthält "class= "details" irgendwo in der öffnen-tag.
Wollen match <table border="0" class="details">
nicht <table border="0">
Schrieb dieses, um es anzupassen:
'#<table(.+?)class="details"(.+?)>#is'
Den <table(.+?)
schafft ein problem, da es mit den ersten table-tag es findet nur stoppen das Spiel, wenn es findet class="details"
egal, wie weit unten der code, auf den es Auftritt.
Ich denke, diese Logik wäre fix mein problem:
"Match <table
aber nur, wenn es enthält class="details"
vor der nächsten >
"
Wie kann ich dies Schreibe?
- Haben Sie versucht, mit Hilfe eines HTML-parsers. Auch, stackoverflow.com/questions/1732348/...
- Chris, ich brauchen, um zu erreichen, zwei Dinge: 1. lernen von regulären Ausdrücken 2. tatsächlich erreichen die oben angegebene Aufgabe nach genug lernen. Reguläre Ausdrücke sind unzureichend für diese Aufgabe. Ihre Antwort erfüllt mein zweites Ziel. Viel Dank
- HTML und regexes ist wie Cäsium und Wasser... Sie warten für eine Katastrophe, wenn Sie beides vermischen. Sie sind nicht nur unzureichend für diese Aufgabe... Es ist geradezu gefährlich, verwenden Sie für diese Aufgabe. Betrachten Sie einen anderen Weg, um zu lernen, reguläre Ausdrücke, da dies nicht einem gültigen use-case, für Sie sowieso.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Während der regulären Ausdrücke kann gut für eine große Vielzahl von Aufgaben, ich finde es fällt in der Regel kurz beim Parsen von HTML-DOM. Das problem bei HTML ist, dass die Struktur Ihres Dokuments ist so variabel, dass es schwer ist zu genau (und mit genau meine ich 100% - Erfolg-rate mit keine falsch positiven) extrahieren Sie einen tag.
Was ich empfehlen Sie tun, ist mit einem DOM-parser wie
phpQuery
und verwenden Sie es als solche:Manche mögen denken, das ist übertrieben, aber am Ende wird es einfacher sein, zu warten und ermöglicht auch eine bessere Erweiterbarkeit. Beispielsweise die Verwendung des DOM-parsers, habe ich auch noch das alt-Attribut.
Einem regulären Ausdruck könnte erarbeitet werden, um das gleiche Ziel erreichen, aber nur begrenzt in der Weise, dass es zwingen würde, die
alt
Attribut werden nach dersrc
oder das Gegenteil, und um diese Einschränkung zu überwinden möchte hinzufügen, mehr Komplexität des regulären Ausdrucks.Berücksichtigen Sie außerdem die folgenden. Richtig mit einer
<img>
- tag mit regulären Ausdrücken und bekommen nur diesrc
Attribut (erfasst in der Gruppe 2), müssen Sie den folgenden regulären Ausdruck:Dann wieder, die oben genannten kann fehlschlagen, wenn:
i
modifier nicht benutzt.src
Attribut.src
verwendet die>
Zeichen irgendwo in Ihrem Wert.Also nochmal, einfach nicht mit regulären Ausdrücken Parsen einen dom-Dokument.
Einfaches Beispiel, wie Ihr problem zu lösen mit
phpQuery
:Werden Sie wahrscheinlich brauchen eine Positive Look-Ahead in irgendeiner form, als eine sehr grobe eine, die hat eindeutig Ihre Grenzen...
HTML-Code nicht parseable ( zuverlässig ) mit regulären Ausdrücken. Es gibt einige einfache Fälle, die eine Lösung haben, aber Sie sind Ausnahmen. Ich denke, dass Ihr Fall ist unlösbar mit regex, aber ich bin nicht sicher,
Sollten Sie mit der Verwendung von XML-tools und XML-Parser wie XPath für die Suche und testen von Bedingungen. Es ist sehr einfach zu schreiben, der Ausdruck passt zu Ihrem Fall. Ich weiß nicht, wie das erstellen von XML-Baum und ausführen von XPath-Abfragen in PHP XPath-Ausdruck ist
Könnten Sie eventuell einen Regex verwenden, wie die folgenden:
Aber die oben genannten user sind richtig im Ausspruch, dass es wäre viel besser für die Verwendung eines xml/html-type-parser finden Sie Ihren Artikel.