14 Stimmen

Regulärer Ausdruck, um ein Attribut aus einem HTML-Tag zu erhalten

Ich bin auf der Suche nach einem regulären Ausdruck, der mir src (Groß-/Kleinschreibung nicht berücksichtigt) Tag aus folgenden HTML-Schnipseln in Java erhalten kann.

<html><img src="kk.gif" alt="text"/></html>
<html><img src='kk.gif' alt="text"/></html>
<html><img src = "kk.gif" alt="text"/></html>

27voto

DMI Punkte 6403

Eine Möglichkeit:

String imgRegex = "<img[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>";

ist eine Möglichkeit (wenn sie case-insensitiv abgestimmt ist). Es ist ein ziemliches Durcheinander und ignoriert absichtlich den Fall, dass keine Anführungszeichen verwendet werden. Um es darzustellen, ohne sich um String-Escapes zu kümmern:

<img[^>]+src\s*=\s*['"]([^'"]+)['"][^>]*>

Das passt:

  • <img
  • ein oder mehrere Zeichen, die keine sind > (d.h. mögliche andere Attribute)
  • src
  • optionaler Leerraum
  • =
  • optionaler Leerraum
  • Startbegrenzer von ' o "
  • Bildquelle (die kein einfaches oder doppeltes Anführungszeichen enthalten darf)
  • Endbegrenzer
  • obwohl der Ausdruck hier aufhören kann, habe ich dann hinzugefügt:
    • null oder mehr Zeichen, die nicht > (weitere mögliche Attribute)
    • > zum Schließen des Tags

Zu beachtende Punkte:

  • Wenn Sie die src= auch die offene Klammer weiter nach links verschieben :-)
  • Dies kümmert sich nicht um den Ausgleich von Begrenzungszeichen oder um Attributwerte ohne Begrenzungszeichen, und es kann auch schlecht geformte Attribute verschlucken (wie Attribute, die > oder Bildquellen, die Folgendes umfassen ' o " ).
  • Das Parsen von HTML mit regulären Ausdrücken wie diesem ist nicht trivial und bestenfalls ein schneller Hack, der in den meisten Fällen funktioniert.

18voto

cletus Punkte 596503

Diese Frage wird hier häufig gestellt.

Reguläre Ausdrücke sind ein schlecht um dieses Problem zu lösen. Tun Sie sich selbst einen Gefallen und verwenden Sie einen HTML-Parser irgendeiner Art.

Regexe sind für das Parsen von HTML unzuverlässig. Sie werden mit einem komplizierten Ausdruck enden, der sich in einigen Eckfällen unerwartet verhält, die wird sonst passieren.

Edita: Si dann ist Ihr HTML so einfach:

Pattern p = Pattern.compile("src\\s*=\\s*([\\"'])?([^ \\"']*)");
Matcher m = p.matcher(str);
if (m.find()) {
  String src = m.group(2);
}

Und es gibt eine beliebige Anzahl von Java-HTML-Parsern da draußen.

1voto

Shree Krishna Punkte 8213

Diese Antwort ist für Google-Suchende, denn es ist zu spät

Kopieren cletus's zeigte Fehler und Ändern seiner Antwort und Weitergabe des geänderten Strings src\\s*=\\s*([\"'])?([^\"']*) als Parameter übergeben in Pattern.compile hat für mich funktioniert,

Hier ist das vollständige Beispiel

    String htmlString = "<div class=\"current\"><img src=\"img/HomePageImages/Paris.jpg\"></div>"; //Sample HTML

    String ptr= "src\\s*=\\s*([\"'])?([^\"']*)";
    Pattern p = Pattern.compile(ptr);
    Matcher m = p.matcher(htmlString);
    if (m.find()) {
        String src = m.group(2); //Result
    }

0voto

Mnementh Punkte 48509

Sie meinen das src-Attribut des img-Tags? In diesem Fall können Sie das folgende verwenden:

<[Ii][Mm][Gg]\\s*([Ss][Rr][Cc]\\s*=\\s*[\"'].*?[\"'])

Das sollte funktionieren. Der Ausdruck src='...' steht in Klammern, ist also eine Abgleichsgruppe und kann separat verarbeitet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X