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:

http://www.regular-expressions.info/reference.html

http://www.regular-expressions.info/refadv.html

Mayman

Verwenden von Regex zum Abrufen von Text zwischen mehreren HTML Tags
Tom Jacques

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:

<div><div>stuff</div>
<div>stuff</div>
<div>stuff</div><div>stuff2</div>
<div>stuff</div><div>stuff2</div></div>
<div>stuff2</div>
<div>stuff2</div></div>

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

1641924321 752 Verwenden von Regex zum Abrufen von Text zwischen mehreren HTML Tags
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


Verwenden von Regex zum Abrufen von Text zwischen mehreren HTML Tags
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


1641924321 869 Verwenden von Regex zum Abrufen von Text zwischen mehreren HTML Tags
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

.

377390cookie-checkVerwenden von Regex zum Abrufen von Text zwischen mehreren HTML-Tags [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy