Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Moin,
ich bin nich so fit in Regular Expressions und bräuchte eine Regex, die mir alles ausserhalb eines Tags matcht. Also quasi:
Hallo ich soll gematcht werden [tag]und ich nicht[/tag]
Hat da jemand ne Idee?
Ich hab bereits eine Regex, die mir die Tags rausfiltert, aber ich brauche eben eine, die alles matcht, das NICHT in den Tags steht, damit ich das entsprechend parsen kann. Und PHP bringt mich auch nich weiter
Kurz zum eigentlichen Problem:
Benutzer meiner Webanwendung geben im Backend über eine Eingabemaske Daten ein, die dann im Frontend angezeigt werden. Wenn ein Benutzer auf ein Objekt in der DB referenzieren will, muss er den Namen des Objekts mit [link]...[/link] markieren. Das ganze habe ich mit folgendem Code realisiert:
Java:
String regex = "\\[link\\](.+?)\\[/link\\]";
HashMap hm = new HashMap();
hm.put("foo", "1");
hm.put("bar", "2");
String s = "[link]foo[/link]hat Einfluss auf [link]bar[/link]"; //bsp text
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(s);
while (m.find()) {
String word = m.group(1);
String url = "<a href=\"http://www.google.de?q=" + word + "&id=" + hm.get(word) + "\">" + word + "</a>";
s = s.replaceAll("\\[link\\]" + word + "\\[/link\\]", url);
}
System.out.println(s);
Das Problem sind jetzt aber Sonderzeichen ausserhalb der link-tags, die nichtmehr als HTML geparsed werden. Ich könnte zwar
Java:
s.replaceAll("&", "&");
usw. machen, dann würden aber evtl. Sonderzeichen innerhalb der Links escaped, was wiederum nicht gewünscht ist
Ich hab bereits eine Regex, die mir die Tags rausfiltert, aber ich brauche eben eine, die alles matcht, das NICHT in den Tags steht, damit ich das entsprechend parsen kann.
Und PHP bringt mich auch nich weiter
Ich entschuldige mich für das PHP, ich habe das gewhält weil es Regex einfach 100mal besser kann als Java und ich einen Codesalat vermeiden wollte.
PHP:
preg_replace($regex, $replacement, $target)
Ersetzt alle matches von
Code:
$regex
mit
Code:
$replacement
im String
Code:
$target
. Das führt also dazu, dass im Rückgabewert von
Code:
preg_replace
nurnoch der Text vorhanden ist, der nicht in einem Tag stand.
Wenn du jetzt also deine Regex auf die restlichen Text anwendest, bekommst du nur den Text, der auch ausserhalb von Tags ist.
[EDIT]
Wenn du google bemühst, findest du vllt eine Java-Parallele zu PHP [c]htmlspecialchars[/c] bzw. [c]htmlentitties[/c], welche genau das macht, was du willst: Sonderzeichen so umwandeln, dass der Browser sie frisst und gleichzeitig XSS unterbindet.[/EDIT]