preg_match - 08 oder 09 statt 8 oder 9
frankx
- programmiertechnik
0 MudGuard0 Texter mit x0 frankx
0 Darkwind
Ahoi,
$pattern='/[0-9]{2}\.200[8|9]/';
$string = "20.12.2009";
preg_match($pattern,$string,$matches);
var_dump($matches);
// array(1) {
// [0]=>
// string(7) "12.2009"
// }
$pattern='/[0-9]{2}\.20[08|09]/';
$string = "20.12.2009";
preg_match($pattern,$string,$matches);
var_dump($matches);
// array(1) {
// [0]=>
// string(7) "12.200"
// }
Warum wird die "9" beim zweiten Beispiel abgeschnitten?
Dank und Gruß,
Hi,
$pattern='/[0-9]{2}.200[8|9]/';
Soll wirklich nach der 200 eine 8, eine 9 oder ein Pipe-Zeichen stehen dürfen?
$pattern='/[0-9]{2}.20[08|09]/';
nach der 20 darf ein 0, eine 8, ein Pipe oder eine 9 kommen.
Warum wird die "9" beim zweiten Beispiel abgeschnitten?
Weil Du eine Zeichenklasse verwendest, diese matcht genau ein Zeichen.
(?:08|09) entspricht wohl in etwa dem, was Du willst.
Wobei 0(?:8|9) bzw 0[89] effizienter sind, weil weniger Backtracking stattfinden muß.
cu,
Andreas
Ahoi,
Hi,
»» $pattern='/[0-9]{2}.200[8|9]/';
Soll wirklich nach der 200 eine 8, eine 9 oder ein Pipe-Zeichen stehen dürfen?
Nein (;-).
»» $pattern='/[0-9]{2}.20[08|09]/';
nach der 20 darf ein 0, eine 8, ein Pipe oder eine 9 kommen.
s.o.
»» Warum wird die "9" beim zweiten Beispiel abgeschnitten?
Weil Du eine Zeichenklasse verwendest, diese matcht genau ein Zeichen.
(?:08|09) entspricht wohl in etwa dem, was Du willst.
Wobei 0(?:8|9) bzw 0[89] effizienter sind, weil weniger Backtracking stattfinden muß.
Ja, es kommt aber noch 2010 dazu, also 20(?:08|09|10) - das Fragezeichen heißt, dass das eins der folgenden Vorkommen muss? 20(09|10) würde nicht gehen?
Dank und Gruß,
Hi,
Ja, es kommt aber noch 2010 dazu, also 20(?:08|09|10) - das Fragezeichen heißt, dass das eins der folgenden Vorkommen muss? 20(09|10) würde nicht gehen?
Nein. Das ?: bedeutet, daß es sich bei den Klammern um non-capturing Klammern handelt.
Läßt man das weg, sind es capturing Klammern - der dadurch gematchte Teilstring könnte später wiederverwendet werden.
capturing sollte man nur benutzen, wenn man den gematchten Teilstring tatsächlich braucht, denn das kostet Laufzeit.
cu,
Andreas
» (?:08|09) entspricht wohl in etwa dem, was Du willst.
» Wobei 0(?:8|9) bzw 0[89] effizienter sind, weil weniger Backtracking stattfinden muß.Ja, es kommt aber noch 2010 dazu, also 20(?:08|09|10) - das Fragezeichen heißt, dass das eins der folgenden Vorkommen muss? 20(09|10) würde nicht gehen?
warum prüfst du diese Zahl nicht mit einer einfachen Addition?
Du weißt das reguläre Ausdrücke nicht unbedingt schnell sind?
Struppi.
Ahoi,
warum prüfst du diese Zahl nicht mit einer einfachen Addition?
Was würde ich denn womit addieren?
Dank und Gruß,
Ahoi,
» warum prüfst du diese Zahl nicht mit einer einfachen Addition?
Was würde ich denn womit addieren?
das aktuelle Jahr mit dem Bereich wo das Datum gültig sein soll.
Struppi.
Warum wird die "9" beim zweiten Beispiel abgeschnitten?
Gegenfrage, warum verwendest Du da hinten eckige Klammern?
Ahoi,
»» Warum wird die "9" beim zweiten Beispiel abgeschnitten?
Gegenfrage, warum verwendest Du da hinten eckige Klammern?
weil ich dachte, dass so das "oder" zu platzieren wäre. jetzt weiß ich, dass es runde sein müssen und ein ?: verhindert, dass der Inhalt als extra-Match im Ergebnis mit auftaucht bzw. für lookbehinds oder wie die sich nennen benutzt werden kann.
Dank und Gruß,
Erledigt, mein Fenster war nicht aktuell und so habe ich nicht gesehen, daß es schon aufgeklärt war.
$pattern='/[0-9]{2}.200[8|9]/';
Falsch!
Richtig wäre /[0-9]{2}.200[89]/
$pattern='/[0-9]{2}.20[08|09]/';
Falsch!
Richtig wäre /[0-9]{2}.200(?:08|09)/
Zeichen in eckige Klammern representieren eine Stelle, welche mit den in der eckigen Klammer stehen.
(?:) fasst Zeichengruppen, die keine Variable bekommen sollen. Diese können mit dem Oder | getrennt werden.
Gruß,
Darkwind