Schrift
[thread]7686[/thread]

regex sanity check (Seite 2)



<< |< 1 2 >| >> 15 Einträge, 2 Seiten
jmb
 2006-02-08 18:16
#62758 #62758
User since
2006-02-08
30 Artikel
BenutzerIn
[default_avatar]
das waer sehr schoen ja, leider kommt die regex von einer dot net applikation :( und die regex container von dot net sind leider nicht 100% perl oder pcre kompatibel... :(

wuerd mir aber einen arsch voll arbeit sparen! ;)
Ishka
 2006-02-08 21:24
#62759 #62759
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Der Overhead von unless(eval {qr($regex)}) ist mE. deutlich kleiner, als wenn man sich da ne n Monster-Ausdruck an regulären Ausdrücken zusammenbastelt, den du brauchen wirst, da die RE in perl recht Syntaxreich sind.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
jmb
 2006-02-09 09:25
#62760 #62760
User since
2006-02-08
30 Artikel
BenutzerIn
[default_avatar]
das problem bei eval - unabhängig von der performance, über die wir uns wahrscheinlich noch lange unterhalten können - ist mein Problem jetzt, dass das Modul leider nicht alle Fehler in der Regex abfängt. Soll heißen, ein { am Ende der Regex, das Perl nicht gefällt, kommt problemlos durch das Modul.

Jetzt bin ich an den Punkt, wo ich wirklich ernsthaft über die eval Geschichte nachdenke - Problem ist, dass ich dem User dann den Fehler nicht zurückgeben kann - ich kann ihm dann lediglich sagen, dass die Regex, die er übergeben hat, nicht valide ist.

Daher würde ich jetzt das Modul erweitern und für spezielle Fälle (Klammern und Varialben) Check Funktionen schreiben, die überprüfen, wieviele Klammern gesetzt wurden, wieviel davon nicht escaped sind (wieviel der escapes selber nicht escapet sind) und ob die Anzahl der Beginning Tags mit den Ending Tags passt. Somit kann ich "relativ" genau bestimmen, wo der Fehler liegt. Die letzte Instanz wäre dann ein eval Block, der prüft, ob die Regex hinhaut - wenn nicht, bekommt der User ein "undefined error" zurück.

Freue mich über kritische Kommentare ;)

jmb
ptk
 2006-02-09 09:52
#62761 #62761
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Du musst zwischen String-eval und eval { } unterscheiden. Letzteres hat kein Performanceproblem und man kann Fehler sicher abfangen. Beispiel:
Code: (dl )
1
2
3
4
5
$rx = "bla("; # falsche Regexp
eval {
$foo =~ /$rx/;
};
warn $@ if $@; # hier kann man den Fehler abfragen

Allerdings sollte man trotzdem den Taint-Modus laufen lassen, wenn die Daten aus einer unsicheren Quelle kommen, und sich "perldoc re" anschauen.
jmb
 2006-02-09 09:58
#62762 #62762
User since
2006-02-08
30 Artikel
BenutzerIn
[default_avatar]
ich neige mein haupt in demut.

vielen dank, das sind genau die beiden tipps, die ich gebracht habe - vielen dank

jmb
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2006-02-08 14:43.