PHP regulärer Ausdruck named Capture ?<name> oder ?P<name>

klausschreiber

Well-known member
ID: 162475
L
6 Mai 2006
247
8
Hallo,

da ein regulärer Ausdruck bei mir lokal ging, online jedoch nicht, bin ich auf etwas verwunderliches gestoßen.

Wenn ich mir die Treffer von preg_match als assoziatives Array ausgeben lassen wollte, habe ich normalerweise immer "?<name>" benutzt.

Mal ein Beispiel:
PHP:
$test = "Hallo, ich heisse Klaus und bin 23 Jahre alt.";
$regex = "/^[^,]*, (?<bezug>[^ ]*).*(?<alter>[0-9]{2}) .*\.$/";
if (preg_match($regex, $test, $result)) {
    print_r($result);
}
funktioniert bei mir lokal (xampp), online jedoch kommt die Fehlermeldung
Code:
Warning: preg_match() [function.preg-match]: Compilation failed: unrecognized character after (?< at offset 11 in /home/www/web137/html/test/regex.php on line 4

Ich habe nun hier die Syntax "?P<name>" gefunden.
Beispiel:
PHP:
$test = "Hallo, ich heisse Klaus und bin 23 Jahre alt.";
$regex = "/^[^,]*, (?P<bezug>[^ ]*).*(?P<alter>[0-9]{2}) .*\.$/";
if (preg_match($regex, $test, $result)) {
    print_r($result);
}
funktioniert auch auf meinem online Server.

Aber was ist der Unterschied zwischen "?<name>" und "?P<name>"? In xampp funktioniert ja Beides und die erste Version muss ich ja auch irgendwo mal gelesen haben (kann sie mir ja nicht aus den Fingern gesaugt haben:biggrin:) und lokal funktioniert die Variante ja auch, nur auf meinem online Server nicht.


Gruß,
Klaus
 
Lokal habe ich die PHP-Version 5.3.1 und online die Version 5.2.9. Ich hatte jedoch auch lokal schon ältere Versionen, wo meine erste Variante ohne P auch funtkioniert hat.

Aber preg_match benutzt ja glaub pcre? Da habe ich lokal die Version "8.00 2009-10-19" und online die Version "6.6 06-Feb-2006". Liegt es vielleicht daran? Wurde da irgendwann mal etwas an der Syntax geändert?


Gruß,
Klaus
 
jo, des stimmt natürlich^^.

Bin jetzt mal auf die Idee gekommen, nach nem Changelog zu googlen und es wurde tatsächlich in Version 7 geändert:
Named groups can now be defined as (?<name>...) or (?'name'...) as well as (?P<name>...). The new forms, as well as being in Perl 5.10, are also .NET compatible.
Frage mich zwar, warum mein Hoster eine Version von 2006 installiert hat, aber solange ich keine weiteren Probleme bekomme, ist das ja egal.

Danke für eure Hilfe,
Klaus