Hi seth,
RegEx: (?:((?<==)[a-zA-Z0-9\_-[]]+))
wozu die aeussere klammer?
/(?:((?<==)[a-zA-Z0-9\_-[]]+))/
Die äußerste "Klammerung: (?:...)" habe ich mal "vorsichtshalber" gesetzt und sie macht den Rest nur "nicht gierig". Ich hab zwar kein Bsp. gefunden, wo die Gier ein Problem gewesen wäre (und glaube, dass es in dem Fall auch keines gibt), aber dachte mir, dass es auch nicht schaden kann (in etwa analog zu defensiver Programmierung, wenn ich z.B. etwas in einen try-catch-Block schreibe, wo mir auf gedei und verderb nichts einfällt, wie das eine Exception werfen könnte).
Die zweite Klammer ist eigentlich auch überflüssig. Die habe ich nur gesetzt, um auszuprobieren, ob sich das gierige Innere (\2) und das nicht gierige äußere (\1) irgendo unterscheiden.
underscore (_) muss uebrigens nicht maskiert werden.
und "[" innerhalb einer zeichenklasse auch nicht.
und wenn das minus am beginn oder ende der zeichnklasse steht, muss es auch nicht maskiert werden.
also:/(?<==)[a-zA-Z0-9_[]-]+/
sollte das gleiche sein, ist aber kuerzer und es ist besser lesbar.
Super, habe ich noch nicht gewusst, dass man in diesen Fällen nicht maskieren muss.
Wie muss ich jetzt weitermachen, dass zwischen den Tags nichts mehr getroffen wird?
ich wuerde es nicht mittels eines einziges ausdrucks angehen. uebersichtlicher ist es, das problem zweizuteilen. da du allgemein ueber die "programmiertechnik" sprichst, nehme ich jetzt mal perl zur hand. in php kann man das vermutlich so aehnlich (bloss nicht so huebsch) bewerkstelligen.
Hier hab eich meine Frage offensichtlich etwas blöd forumliert und bin viel zu stark auf mein Beispiel verhaftet geblieben. Was ich eigentlich wissen /lernen will ist, wie ich es am besten angehe, wenn ich was komliziertes mit RegEx lösen will. Hier bin ich es so angegangen, dass ich zunächst versucht habe, alle Attribute zu treffen, dann habe ich probiert, wie ich "hinzu kombinieren kann", dass diese Treffer auch innerhalb von Tags liegen (also quasi inside-out od. bottom-up oder so ähnlich - wäre das prinzipiell ein brauchbarer Anfang?). Wenn dann ein Punkt kommt, an dem es nicht weitergeht, mit welcher Strategie fährt man fort? - Versucht man einen Lösungsweg für den nächsten Problemteil separat zu finden und ihn mit dem anderen Teil zu kombinieren? - Fängt man besser gleich mit einem anderen Ansatz von Vorne an?
schaue dir mal an, das \G fuer ein tolles dings ist: perldoc perlre und perldoc perlop.
bei "perlop" ist auch ein beispiel eines kleinen scanners, wie du ihn auch bauen koenntest.eine erste loesung (nicht gucken, falls du selbst erst ueberlegen moechtest) koennte
#!/usr/bin/perl -w
use strict;
$_='<div class=foo1y id="barnn"><span class=foo1y id=bar1y>nix=barn und nix=barn</span>foonbarn</div>';
while(/</g){
while(/\G[^>=]+=(?:([^" >]+)|"[^"]*")/gc){
print $1,"\n" if defined $1;
}
}
Das ist wirklich ganz nett. Auf die Art und Weise kann man es sicher in diversen Sprachen angehen. Ich hab mir preg\_match in PHP zwar noch nie genauer angesehen, denke aber, dass es auch da ziemlich einfach wäre, mit einem ersten Durchlauf alle Tags in ein Array zu holen um auf diese Treffer dann das obige Pattern loszulassen.
Nichtsdesto trotz möchte ich es dennoch "in einer RegEx" lösen können.
Danke und viele Grüße
Michi