RegEx
Powl
- php
Hallo,
Wenn ich folgenden Code PHP5 parsen lasse:
if (preg_match("@^[a-zA-Z äöüÄÖÜß-_]{1,40}$@", $_POST['foo'])) {
mach was();
}
erhalte ich folgenden Fehler:
Warning: preg_match() [function.preg-match]: Compilation failed: range out of order in character class at offset 13 in /foo/bar/baz/bla.php on line xy
bei
preg_match("@^[\w äöüÄÖÜß-_]{1,40}$@", $_POST['foo']))
genauso.
Ich finde bei Google zwar elend viele Seiten, wo der auch Fehler auftritt, aber keine die es mir verständlich machen könnte, wie man ihn los wird.
Was habe ich hier falsch gemacht, und was muss ich ändern, damit auf alle Buchstaben incl. Umlaute und ß sowie - und _ und Leerzeichen matched?
Nächste Frage, wenn ich Zeilenumbrüche aus $_Post[$k] entfernen möchte, wäre es dann sinnvoller so:
$_POST[$k] = preg_replace("!\015\012|\012|\015!", "", $_POST[$k]);
oder so
$_POST[$k] = preg_replace("!\n\r|\n|\r!", "", $_POST[$k]);
funktionieren müssten doch beide, oder?
Vieleicht gibt es noch eine bessere Möglichkeit?
dankbar für jeden hilfreichen Hinweis
netten Tag
^da Powl
if (preg_match("@[1]{1,40}$@", $_POST['foo'])) {
mach was();
}
Da die Range ß bis \_ nicht definiert ist. Du musst spezielle RegEx-Zeichen mit \ maskieren. In diesem Fall das - durch \-
> Nächste Frage, wenn ich Zeilenumbrüche aus $\_Post[$k] entfernen möchte, wäre es dann sinnvoller so:
> `$_POST[$k] = preg_replace("!\015\012|\012|\015!", "", $_POST[$k]);`{:.language-PHP}
> oder so
> `$_POST[$k] = preg_replace("!\n\r|\n|\r!", "", $_POST[$k]);`{:.language-PHP}
> funktionieren müssten doch beide, oder?
Du kannst mir 2x str\_replace (einmal \r und einmal \n) alles enternen ohne jemals reguläre Ausdrücke nutzen zu müssen.
a-zA-Z äöüÄÖÜß-_ ↩︎
Hallo,
Da die Range ß bis _ nicht definiert ist. Du musst spezielle RegEx-Zeichen mit \ maskieren. In diesem Fall das - durch -
Ja, natürlich. Danke, daran hatte ich gestern Nacht nicht mehr gedacht. Der Wald und die Bäume ;)
Du kannst mir 2x str_replace (einmal \r und einmal \n) alles enternen ohne jemals reguläre Ausdrücke nutzen zu müssen.
Auch richtig. Bliebe nur die Frage was performanter wäre, 1*preg_replace oder 2* str_replace.
Danke für Deine Antwort
netten Tag
^da Powl
Auch richtig. Bliebe nur die Frage was performanter wäre, 1*preg_replace oder 2* str_replace.
Mein Gefühl sagt mir 2 Mal str_replace.
gudn tach!
Bliebe nur die Frage was performanter wäre, 1*preg_replace oder 2* str_replace.
2*str_replace (oder auch 1*str_replace mit search-array) ist schneller:
<?php
$no_it = 1000;
$alg = array('str_replace', 'preg_replace');
// $str muss noch gesetzt werden.
echo $alg[0],"\n";
$time_begin = microtime(true);
for($it=$no_it; $it>=0; --$it) {
$temp = str_replace("\n", '', $str);
$temp = str_replace("\r", '', $temp);
}
$time_end = microtime(true);
$time = $time_end-$time_begin;
echo 'time: ',$time,' seconds',"\n";
echo $alg[1],"\n";
$time_begin = microtime(true);
for($it=$no_it; $it>=0; --$it) {
$temp = preg_replace("/[\n\r]+/", '', $str);
}
$time_end = microtime(true);
$time = $time_end-$time_begin;
echo 'time: ',$time,' seconds',"\n";
?>
kannst ja mal mit diesem php5-code (fuer php4 muss microtime umgebaut werden) rumspielen. lange strings, kurze strings, viele zeilenumbrueche, wenige zeilenumbrueche, ...
prost
seth
echo $begrüßung;
if (preg_match("@[1]{1,40}$@", $_POST['foo'])) {
mach was();
}
>
> Da die Range ß bis \_ nicht definiert ist. Du musst spezielle RegEx-Zeichen mit \ maskieren. In diesem Fall das - durch \-
Das ist in einem Perl-kompatiblen regulären Ausdruck auch abhängig wo das Zeichen steht. Innerhalb einer Zeichenklasse sind weniger Zeichen unbedingt zu maskieren als außerhalb. Das Minuszeichen kann man auch unmaskiert als erstes oder letztes Zeichen in der Zeichenklasse notieren, damit es nicht als Bereichskennzeichnung angesehen wird.
echo "$verabschiedung $name";
a-zA-Z äöüÄÖÜß-_ ↩︎
Hallo Powl,
$_POST[$k] = preg_replace("!\015\012|\012|\015!", "", $_POST[$k]);
$_POST[$k] = preg_replace("!\n\r|\n|\r!", "", $_POST[$k]);
Beide sind wegen den Alternationen schlecht.
Nimm eine Zeichenklasse [\n\r]+
Gruß Uwe