Verwenden von Regex zum Abrufen von Text zwischen mehreren HTML-Tags [duplicate]
Lesezeit: 5 Minuten
Mit Regex möchte ich den Text zwischen mehreren DIV-Tags abrufen können. Zum Beispiel Folgendes:
<div>first html tag</div>
<div>another tag</div>
Würde ausgeben:
first html tag
another tag
Das Regex-Muster, das ich verwende, stimmt nur mit meinem letzten div-Tag überein und verfehlt das erste. Code:
static void Main(string[] args)
{
string input = "<div>This is a test</div><div class="something">This is ANOTHER test</div>";
string pattern = "(<div.*>)(.*)(<\/div>)";
MatchCollection matches = Regex.Matches(input, pattern);
Console.WriteLine("Matches found: {0}", matches.Count);
if (matches.Count > 0)
foreach (Match m in matches)
Console.WriteLine("Inner DIV: {0}", m.Groups[2]);
Console.ReadLine();
}
Ausgabe:
Übereinstimmungen gefunden: 1
Inner DIV: Dies ist ein weiterer Test
Ist es für diese Aufgabe zwingend erforderlich, dass Sie einen regulären Ausdruck verwenden? HTML ist eine kontextfreie Grammatik, die nicht mit regulären Ausdrücken geparst werden kann. Oftmals können Sie nahe herankommen, aber es wäre besser, einen HTML-Parser zu verwenden. Siehe stackoverflow.com/a/1732454/2022565
– Tom Jacques
14. Apr. ’13 um 23:20
Ersetzen Sie Ihr Muster durch ein nicht gieriges Spiel
static void Main(string[] args)
{
string input = "<div>This is a test</div><div class="something">This is ANOTHER test</div>";
string pattern = "<div.*?>(.*?)<\/div>";
MatchCollection matches = Regex.Matches(input, pattern);
Console.WriteLine("Matches found: {0}", matches.Count);
if (matches.Count > 0)
foreach (Match m in matches)
Console.WriteLine("Inner DIV: {0}", m.Groups[1]);
Console.ReadLine();
}
Es hat beide Übereinstimmungen gefunden, zeigt jedoch leere Werte in meinem Programm an
– Ben
14. April ’13 um 23:51
Der obige Code sollte funktionieren, beachten Sie, dass seine m.Groups[1] und nicht m.Gruppen[2] da ich es ein wenig geändert habe, da es keinen Grund gibt, das Tag selbst zu erfassen. rubular.com/r/XQrobmfAK
– coolmine
15. Apr. ’13 um 0:00
Wie andere Jungs nicht erwähnt haben HTML tags with attributes, hier ist meine Lösung, um damit umzugehen:
// <TAG(.*?)>(.*?)</TAG>
// Example
var regex = new System.Text.RegularExpressions.Regex("<h1(.*?)>(.*?)</h1>");
var m = regex.Match("Hello <h1 style="color: red;">World</h1> !!");
Console.Write(m.Groups[2].Value); // will print -> World
Denken Sie zunächst daran, dass Sie in der HTML-Datei ein neues Zeilensymbol (“n”) haben, das Sie nicht in den String eingefügt haben, mit dem Sie Ihre Regex überprüfen.
Zweitens, indem Sie Regex nehmen:
((<div.*>)(.*)(<\/div>))+ //This Regex will look for any amount of div tags, but it must see at least one div tag.
((<div.*>)(.*)(<\/div>))* //This regex will look for any amount of div tags, and it will not complain if there are no results at all.
Auch ein guter Ort, um nach dieser Art von Informationen zu suchen:
Die Kurzfassung ist, dass Sie dies nicht in allen Situationen richtig machen können. Es wird immer Fälle von gültigem HTML geben, bei denen ein regulärer Ausdruck die gewünschten Informationen nicht extrahieren kann.
Der Grund dafür ist, dass HTML eine kontextfreie Grammatik ist, die eine komplexere Klasse ist als ein regulärer Ausdruck.
Hier ist ein Beispiel – was ist, wenn Sie mehrere gestapelte Divs haben?
<div><div>stuff</div><div>stuff2</div></div>
Die als andere Antworten aufgelisteten Regexes greifen:
denn das tun reguläre Ausdrücke, wenn sie versuchen, HTML zu analysieren.
Sie können keinen regulären Ausdruck schreiben, der alle Fälle zu interpretieren versteht, da reguläre Ausdrücke dies nicht können. Wenn Sie es mit einem ganz bestimmten eingeschränkten HTML-Satz zu tun haben, ist dies möglicherweise möglich, aber Sie sollten diese Tatsache im Hinterkopf behalten.
Weitere Informationen: https://stackoverflow.com/a/1732454/2022565
Craig Tullis
Hast du dir das angeschaut? Html-Agility-Paket (siehe https://stackoverflow.com/a/857926/618649)?
CsQuery sieht auch ziemlich nützlich aus (verwenden Sie im Grunde die Syntax im CSS-Selektor-Stil, um die Elemente zu erhalten). Siehe https://stackoverflow.com/a/11090816/618649.
CsQuery ist im Grunde als “jQuery for C#” gedacht, was so ziemlich die genauen Suchkriterien ist, die ich verwendet habe, um es zu finden.
Wenn Sie dies in einem Webbrowser tun könnten, könnten Sie ganz einfach jQuery mit einer ähnlichen Syntax wie . verwenden $("div").each(function(idx){ alert( idx + ": " + $(this).text()); } (nur Sie würden das Ergebnis natürlich in das Protokoll oder den Bildschirm ausgeben oder einen Webservice-Aufruf damit durchführen, oder was auch immer Sie damit tun müssen).
Ein Downvote ohne Erklärung oder Kommentar. Danke! Tatsache ist, dass HTML/XML bei der Verwendung von Regex notorisch lästig ist. Nicht, dass Sie es nicht tun könnten, und ich habe es sicherlich bei zahlreichen Gelegenheiten getan, aber die CSS-Selektorsyntax ist ein viel saubererer Vorschlag.
– Craig Tullis
13. Okt ’16 um 14:38
Tri Nguyen Dung
Ich denke, dieser Code sollte funktionieren:
string htmlSource = "<div>first html tag</div><div>another tag</div>";
string pattern = @"<div[^>]*?>(.*?)</div>";
MatchCollection matches = Regex.Matches(htmlSource, pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline);
ArrayList l = new ArrayList();
foreach (Match match in matches)
{
l.Add(match.Groups[1].Value);
}
Ein Downvote ohne Erklärung oder Kommentar. Danke! Tatsache ist, dass HTML/XML bei der Verwendung von Regex notorisch lästig ist. Nicht, dass Sie es nicht tun könnten, und ich habe es sicherlich bei zahlreichen Gelegenheiten getan, aber die CSS-Selektorsyntax ist ein viel saubererer Vorschlag.
– Craig Tullis
13. Okt ’16 um 14:38
Partha Mondal
Ich hoffe, die folgende Regex wird funktionieren:
<div.*?>(.*?)<*.div>
Sie erhalten Ihre gewünschte Ausgabe
Dies ist ein Test Dies ist ein weiterer Test
.
3773900cookie-checkVerwenden von Regex zum Abrufen von Text zwischen mehreren HTML-Tags [duplicate]yes
Ist es für diese Aufgabe zwingend erforderlich, dass Sie einen regulären Ausdruck verwenden? HTML ist eine kontextfreie Grammatik, die nicht mit regulären Ausdrücken geparst werden kann. Oftmals können Sie nahe herankommen, aber es wäre besser, einen HTML-Parser zu verwenden. Siehe stackoverflow.com/a/1732454/2022565
– Tom Jacques
14. Apr. ’13 um 23:20