Reihenfolge im img Tag bei einem Regularexpression ist egal

Dunas

Erfahrenes Mitglied
Hallo,
ich versuche gerade ein Regularexpression zu finden welches folgende Strings matched.

<img src="/bilder/a.png" title="ein bild a" alt="" />
<img " title="ein bild a" alt="" src="/bilder/a.png />

regular = "<img src="(.+?)" title="(.+?)" alt="" />"
Diese Regularexpression matched die erste Variante, aber nicht mehr die Zweite.
Ich weiß nicht wie ich es hin bekomme, dass ihm die Reihenfolge keine Probleme bereitet.

Liebe Grüße,
Dunas
 
Moin,

verstehe ich Dich richtig ?
dies matcht: <img src="/bilder/a.png" title="ein bild a" alt="" />
dies matcht nicht: <img " title="ein bild a" alt="" src="/bilder/a.png />

Dann ist es (denke ich) klar.
Dein regular besteht quasi aus drei Teilausdrücken, etwa:
A: "<img src="(.+?)
B: " title="(.+?)
C: " alt=""

Du sucht also immer nach "A + B + C"
Versuch mal sowas wie "(A|B){2} C{1}", um den Term (A|B) 2x und C 1x zu suchen!

Hier eine Seite, die alle Qualifizierer recht gut zeigt und erläutert:
http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html

Gruß
Klaus
 
Hallo,

schau mal hier:
Java:
package de.tutorials;

import java.io.StringReader;

import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.xml.sax.InputSource;

public class HtmlParserExample {
  public static void main(String[] args) throws Exception {
    String htmlA = "<img src='/bilder/a.png' title='ein bild a' alt='' />";
    String htmlB = "<img  title='ein bild a' alt='' src='/bilder/a.png' />";

    String valueA = getAttributeValue(htmlA, "src");
    System.out.println(valueA);
    String valueB = getAttributeValue(htmlB, "src");
    System.out.println(valueB);
  }

  static String getAttributeValue(String htmlElement, String attributeName) throws Exception {
    Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(htmlElement)));
    return doc.getFirstChild().getAttributes().getNamedItem(attributeName).getNodeValue();
  }
}

Gruß Tom
 
Danke erst mal für eure Ideen.

vfl_freak deine Idee habe ich nun so Umgesetzt:

String regular = "<img (src=\".+?/\\w+\\.png\" |title=\"[\\w\\s]+\" |alt=\"\" )+";

Hierbei habe ich dann das Problem, dass er in Group(1) immer nur den letzten Parameter hat und ich an die anderen nicht ran komme.


Thomas Darimont deine Idee würde funktionieren, aber ich möchte das ganze am liebsten über Regularexpression lösen.
Aber scheinbar gibt es da keine schicke Möglichkeit.
 
Moin,

Hierbei habe ich dann das Problem, dass er in Group(1) immer nur den letzten Parameter hat und ich an die anderen nicht ran komme
Ich muss zugeben, dass ich diesen Satz nicht verstehe :confused:

String regular = "<img (src=\".+?/\\w+\\.png\" |title=\"[\\w\\s]+\" |alt=\"\" )+";

Versuch' es mal so :
Java:
String regular = "<img (src=\".+?/\\w+\\.png\" | title=\"[\\w\\s]+\" | alt=\"\"){3}+  />";
Ich denke, dass das {3} wichtig ist, damit der Term auch 3x geprüft wird, zudem fehlte IMHO am Ende das /> !

Gruß
Klaus
 
Mithilfe von () kann man ja Gruppen erzeugen und mit m.group(1) auf die erste Gruppe zugreifen.

Java:
String test = "12.23 Uhr";
String regular = "(\\d+)\\.(\\d+) Uhr";

Matcher m = Pattern.compile( regular ).matcher( test );
m.find();
String stunden = m.group(1); // stunden ist dann "12"
String minuten = m.group(2); // minuten ist dann gleich "23"

Bei deinem Beispiel würde jetzt im ersten Fall in m.group(1) "alt=""" stehen im zweiten Fall "src="/bilder/a.png" ".
Das bringt mich auch nicht sehr viel weiter. Ich würde dann jeden Parameter gerne in einer eigenen Group einfangen.

so müsste es aussehen mit deiner 3.
String regular = "<img (src=\".+?/\\w+\\.png\" |title=\"[\\w\\s]+\" |alt=\"\" ){3}/>"
 
Zuletzt bearbeitet von einem Moderator:
ok, da hast Recht ... :eek::p

Du musst die einzelnen Gruppen dann auch noch klammern, damit sie in der 3-fachen Wiederholung zum Tragen kommen und Du zu so was in der Art wie "<img ( (A) | (B) | (C) ){3}+ />" kommst !

Dann würde dann IMHO wohl in etwa so ausschauen:
Java:
String regular = "<img ( (src=\".+?/\\w+\\.png\") | (title=\"[\\w\\s]+\") | (alt=\"\") ){3}+  />";

Gruß
Klaus

EDIT:
Wir nutzen hier in der Firma zum Testen von regulären Ausdrücken das nette kleine
Tool "RegEx coach"! Es kann zusammen mit seiner Doku hier runtergeladen werden:
http://weitz.de/regex-coach ("Windows installer" oder "Linux tar archive")

Ich habe Deinen Ausdruck und den String dort mal eingegeben und gesehen, dass das Pluszeichen am Ende (hinter {3}) hier nicht erlaubt ist ... warum auch immer!
Ich teste den Ausdruck mal eben damit ....
 
Zuletzt bearbeitet:
ok, da hast Recht ... :eek::p

Du musst die einzelnen Gruppen dann auch noch klammern, damit sie in der 3-fachen Wiederholung zum Tragen kommen und Du zu so was in der Art wie "<img ( (A) | (B) | (C) ){3}+ />" kommst !

Dann würde dann IMHO wohl in etwa so ausschauen:
Java:
String regular = "<img ( (src=\".+?/\\w+\\.png\") | (title=\"[\\w\\s]+\") | (alt=\"\") ){3}+  />";

Gruß
Klaus

Jaja Wald und Bäume und so ^^
Wieso bin ich da nicht drauf gekommen?

So funktioniert es perfekt:
Java:
String regular = "<img (?:(src=\".+?/\\w+\\.png\" )|(title=\"[\\w\\s]+\" )|(alt=\"\" )){3}/>";
Mit den Zeichen "?:" wird die äußere Klammer nicht als Group gewertet.

Danke für deine Hilfe!!
 
Jaja Wald und Bäume und so ^^
Wieso bin ich da nicht drauf gekommen?

Mit den Zeichen "?:" wird die äußere Klammer nicht als Group gewertet.

Danke für deine Hilfe!!

Da gebe ich Dir völlig Recht :suspekt:;)
Ist vor allem schlecht wenn mal die eigenen geposteten Dokus nicht kennt :-), weil da ja drin stand:
(?:X) X, as a non-capturing group

Kein Thema - viel Spaß damit :p

tschüss
Klaus
 
Zurück