Schnell HTML-Tags finden

  • Themenstarter Themenstarter htmltags
  • Beginndatum Beginndatum
H

htmltags

Gast
Tag,

ich suche eine möglichst effiziente (also schnelle) Möglichkeit bestimmte
HTML-Tags in einem String zu finden und das was zwischen diesen Tags
steht zu extrahieren und das für alle Tags der gleichen Sorte, nicht nur für eins.

Ein Beispiel:

Alle URLs die im String enthalten sind finden. Diese sind ja meist mit <a href="">
oder so versehen.

Als ersten Ansatz hätte ich da jetzt Pattern verwendet wie z.B.:

Java:
Pattern p = Pattern.compile("<a\\s+href\\s*=\\s*\"?(.*?)[\"|>]", Pattern.CASE_INSENSITIVE);

Allerdings scheint das recht langsam zu sein.

Gibt es da ne effizientere Möglichkeit? (ohne irgendwelche Tools, reines Coding 🙂)
 
htmltags hat gesagt.:
Allerdings scheint das recht langsam zu sein.
Wie kommst du zu der Aussage? Regex ist zwar nicht die schnellste Möglichkeit, aber sicher schnell genug und auf keinen Fall "recht langsam" (zumindest nicht bei dem von Dir beschriebenen Anwendungsfall).
htmltags hat gesagt.:
Gibt es da ne effizientere Möglichkeit? (ohne irgendwelche Tools, reines Coding )
Ja, gibt es. Die größere Effizienz erkauft man sich aber mit etwas weniger Flexibilität:
Java:
  public static void main(String... args) throws Exception {

    String href = "href=\"";

    String aTag = "<a href=\"http://meine.domain.de/test\">Linktext</a>";

    int startIndex = aTag.indexOf(href) + href.length();

    int endIndex = aTag.indexOf('"', startIndex);

    System.out.println(aTag.substring(startIndex, endIndex));
  }
Die Methoden indexOf und substring arbeiten auf dem char-Array. Das ist schneller als Regex-Processing.
 
Ein kleiner Puzzler zu RegEx, den man in ähnlicher Form überall im Netz findet:
Java:
public class RegExTest
{
    public static void main (String[] args) 
    {
        final String pattern = "(aa|aab?)*";

        final String a0 = "aa";
        final String a1 = "aaa";
        final String a2 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        final String a3 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

        System.out.println(a0.matches(pattern)) ;
        System.out.println(a1.matches(pattern)) ;
        System.out.println(a2.matches(pattern)) ;
        System.out.println(a3.matches(pattern)) ;
    }
}
Einfach mal ausführen.


Und wie immer in solchen Fällen: Der Verweis auf Jericho HTML Parser . Ehrlich gesagt weiß ich über die Performance dieses Parsers nichts, aber komfortabler als RegEx und flexibler als manuelles String-Zerhacken ist er auf jeden Fall.
 
Ein Pattern Object ist dafür da, um einen bestimmten Teil im Text zu finden.
In dem Besipiel im vorherigen Post wird nur geschaut, ob dieser Teil enthalten ist.

String.matches gibt true oder false zurück.

Also ist das keine gute Alternative, um etwas in einem String zu finden.
 
Ein Pattern Object ist dafür da, um einen bestimmten Teil im Text zu finden.
In dem Besipiel im vorherigen Post wird nur geschaut, ob dieser Teil enthalten ist.

String.matches gibt true oder false zurück.

Also ist das keine gute Alternative, um etwas in einem String zu finden.
Doch, der Ansatz ist schon ok. Danach muss halt noch ein Matcher erzeugt und mit group gearbeitet werden. Ich glaub aber, dass htmltags das weiß
 

Zurück
Oben