Was ist der beste Weg, um den gesamten Text zwischen zwei Tags auszuwählen - z. B. den Text zwischen allen "Pre" -Tags auf der Seite.
html
regex
html-parsing
Basheps
quelle
quelle
/<div>.*?<\/div>/.exec("<div><div></div></div>")
Antworten:
Sie können
"<pre>(.*?)</pre>"
pre verwenden (pre durch beliebigen Text ersetzen) und die erste Gruppe extrahieren (für spezifischere Anweisungen geben Sie eine Sprache an), dies setzt jedoch die vereinfachende Vorstellung voraus, dass Sie sehr einfaches und gültiges HTML haben.Wie andere Kommentatoren vorgeschlagen haben, verwenden Sie einen HTML-Parser, wenn Sie etwas Komplexes tun.
quelle
<pre>
nach dem Versuch immer noch Tags sehen<pre>(.*?)<\/pre>
, liegt dies daran, dass Sie sich ansehen, was von der vollständigen Übereinstimmung anstelle der (. *?) - Erfassungsgruppe erfasst wird. Klingt kitschig, aber ich denke immer "Klammer = Paar Diebe", denn wenn auf das nicht(
ein?
wie in(?:
oder folgt(?>
, hat jedes Match zwei Captures: 1 für das vollständige Match und 1 für die Capture-Gruppe. Jeder zusätzliche Satz von Klammern fügt eine zusätzliche Erfassung hinzu. Sie müssen nur wissen, wie Sie beide Aufnahmen in der Sprache abrufen, mit der Sie arbeiten.Das Tag kann in einer anderen Zeile ausgefüllt werden. Deshalb
\n
muss hinzugefügt werden.quelle
(.|\n)*?
beim Umgang mit HTML-Tags über mehrere Zeilen hinweg. Die ausgewählte Antwort funktioniert nur, wenn sich die HTML-Tags in derselben Zeile befinden.(.|\n)*?
, um mit einem Zeichen übereinzustimmen. Immer.
mit dems
Modifikator (Singleline) verwenden. Oder eine[\s\S]*?
Problemumgehung./\*(.|\n)*?\*/
Das würde ich verwenden.
Grundsätzlich ist es:
(?<=(<pre>))
Die Auswahl muss mit einem<pre>
Tag vorangestellt werden(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| )
Dies ist nur ein regulärer Ausdruck, den ich anwenden möchte. In diesem Fall werden Buchstaben, Ziffern, Zeilenumbrüche oder Sonderzeichen ausgewählt, die im Beispiel in eckigen Klammern aufgeführt sind. Das Pipe-Zeichen|
bedeutet einfach " ODER ".+?
Pluszeichenzustände zur Auswahl eines oder mehrerer der oben genannten - die Reihenfolge spielt keine Rolle. Das Fragezeichen ändert das Standardverhalten von "gierig" in "ungierig".(?=(</pre>))
Die Auswahl muss an das</pre>
Tag angehängt werdenAbhängig von Ihrem Anwendungsfall müssen Sie möglicherweise einige Modifikatoren wie ( i oder m ) hinzufügen.
Hier habe ich diese Suche in Sublime Text durchgeführt, sodass ich in meinem regulären Ausdruck keine Modifikatoren verwenden musste.
Javascript unterstützt kein Lookbehind
Das obige Beispiel sollte mit Sprachen wie PHP, Perl, Java ... gut funktionieren. Javascript unterstützt jedoch kein Lookbehind, sodass wir die Verwendung vergessen
(?<=(<pre>))
und nach einer Problemumgehung suchen müssen. Vielleicht entfernen Sie einfach die ersten vier Zeichen aus unserem Ergebnis für jede Auswahl wie hier. Regex-Match-Text zwischen TagsSchauen Sie sich auch die JAVASCRIPT REGEX-DOKUMENTATION für nicht erfassende Klammern an
quelle
Verwenden Sie das folgende Muster, um Inhalte zwischen Elementen abzurufen. Ersetzen Sie
[tag]
durch das eigentliche Element, aus dem Sie den Inhalt extrahieren möchten.Manchmal haben Tags Attribute, wie z. B.
anchor
Tags,href
und verwenden dann das folgende Muster.quelle
<[tag]>
wird passen<t>
,<a>
und<g>
Replace [tag] with the actual element you wish to extract the content from
Teil verpasst .[]
sollten ganz weggelassen werden. Das wäre klarer, aufgrund ihrer Bedeutung in RegEx und der Tatsache, dass die Leute zuerst den Code scannen und danach den Text lesen;)So schließen Sie die abgrenzenden Tags aus:
(?<=<pre>)
sucht nach Text nach<pre>
(?=</pre>)
sucht vorher nach Text</pre>
Die Ergebnisse werden innerhalb des
pre
Tags geschriebenquelle
Sie sollten nicht versuchen, HTML mit regulären Ausdrücken zu analysieren. Sehen Sie sich diese Frage an und wie sie sich herausstellte.
Im einfachsten Sinne ist HTML keine reguläre Sprache, daher können Sie es nicht vollständig mit regulären Ausdrücken analysieren.
Sie können jedoch Teilmengen von HTML analysieren, wenn keine ähnlichen Tags verschachtelt sind. Solange etwas dazwischen liegt und nicht das Tag selbst ist, funktioniert dies:
Eine bessere Idee ist es, einen Parser wie das native DOMDocument zu verwenden, um Ihr HTML zu laden, dann Ihr Tag auszuwählen und das innere HTML zu erhalten, das ungefähr so aussehen könnte:
Und da dies ein richtiger Parser ist, kann er Verschachtelungs-Tags usw. verarbeiten.
quelle
php
. IchVersuche dies....
quelle
Dies scheint der einfachste reguläre Ausdruck von allem zu sein, was ich gefunden habe
(?:<TAG>)
von den Übereinstimmungen aus([\s\S]*)
in die Übereinstimmungen ein(?:<\/TAG>)
das schließende Tag von den Übereinstimmungen ausquelle
Diese Antwort setzt Unterstützung für das Umsehen voraus! Dadurch konnte ich den gesamten Text zwischen Paaren von öffnenden und schließenden Tags identifizieren. Das ist der ganze Text zwischen dem '>' und dem '<'. Es funktioniert, weil das Umsehen nicht die Zeichen verbraucht, mit denen es übereinstimmt.
(? <=>) ([\ w \ s] +) (? = </)
Ich habe es in https://regex101.com/ mit diesem HTML-Fragment getestet .
Es ist ein Spiel aus drei Teilen: dem Blick nach hinten, dem Inhalt und dem Blick nach vorne.
Ich hoffe, das dient als Start für 10. Glück.
quelle
Da die akzeptierte Antwort ohne Javascript-Code ist, fügen Sie Folgendes hinzu:
quelle
preg_match_all(/<pre>([^>]*?)<\/pre>/,$content,$matches)
Diese Regex wählt alles zwischen Tags aus. egal es ist in neuer Zeile (arbeiten mit mehrzeiligen.quelle
In Python
DOTALL
erfasst das Setzen des Flags alles, einschließlich Zeilenumbrüche.python example.py
Erfassen von Text zwischen allen öffnenden und schließenden Tags in einem Dokument
Es
finditer
ist nützlich , Text zwischen allen öffnenden und schließenden Tags in einem Dokument zu erfassen . Im folgenden Beispiel sind drei öffnende und schließende<pre>
Tags in der Zeichenfolge vorhanden.python example2.py
quelle
Für mehrere Zeilen:
quelle
Sie können verwenden
Pattern pattern = Pattern.compile( "[^<'tagname'/>]" );
quelle
Ich benutze diese Lösung:
quelle
In Javascript (unter anderem) ist dies einfach. Es umfasst Attribute und mehrere Zeilen:
quelle
quelle