preg_match(): Compilation failed: invalid range in character class at offset
Danke im Voraus für Sie Zeit zu helfen, mit diesem Problem..
preg_match(): Compilation failed: invalid range in character class at offset 20 session.php on line 278
Diese aufgehört zu arbeiten plötzlich nach Monaten der Arbeit, nach einem PHP-upgrade auf unserem server.
Hier ist der code
else{
/* Spruce up username, check length */
$subuser = stripslashes($subuser);
if(strlen($subuser) < $config['min_user_chars']){
$form->setError($field, "* Username below ".$config['min_user_chars']."characters");
}
else if(strlen($subuser) > $config['max_user_chars']){
$form->setError($field, "* Username above ".$config['max_user_chars']."characters");
}
/* Check if username is not alphanumeric */
/* PREG_MATCH CODE */
else if(!preg_match("/^[a-z0-9]([0-9a-z_-\s])+$/i", $subuser)){
$form->setError($field, "* Username not alphanumeric");
}
/* PREG_MATCH CODE */
/* Check if username is reserved */
else if(strcasecmp($subuser, GUEST_NAME) == 0){
$form->setError($field, "* Username reserved word");
}
/* Check if username is already in use */
else if($database->usernameTaken($subuser)){
$form->setError($field, "* Username already in use");
}
/* Check if username is banned */
else if($database->usernameBanned($subuser)){
$form->setError($field, "* Username banned");
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen Charakter-Klasse-Bereich definiert ist, indem zwischen zwei Werten in einer Charakter-Klasse (
[]
im regex).[0-9]
bedeutet, dass alles, was zwischen 0 und 9 (einschließlich). In dem regulären Ausdruck in Ihrem code, müssen Sie mehrere Charakter-Klasse reicht,a-z
,0-9
. Es gibt auch eine Klasse, die Sie wahrscheinlich nicht bedeuten, dort zu setzen, nämlich_-\s
.Dies ist apprently nicht als ein ungültiges Zeichen reichen in einigen (den meisten?) Versionen von PCRE (die regular expression library von PHP verwendet), aber könnte es haben in letzter Zeit verändert, und wenn der PCRE-Bibliothek wurde aktualisiert, auf dem server, das könnte der Grund sein.
Debuggex ist ein nettes tool, die helfen können, debug-Fehler (gut, die Fehlermeldung von PHP erzählten Sie beide die Zeile und das Zeichen, wo der Fehler war, also...) wie diese (ich bin nicht angeschlossen, nur ein fan).
_-\s
macht keinen Sinn, weil eine Reihe.\s-_
\s-_
ist nicht dazu gedacht, als eine Reihe, und es war das Gefühl das gleiche über_-\s
, aber jetzt ist es nicht sicher. WTF??? Ich sage nur setzen Sie den Bindestrich am Ende; das funktioniert in jeder version von jeden Geschmack, die ich kenne.[a-z-0-9]
oder[a-z-1]
. Dann die "Regel" mit PCRE scheint zu sein: In einer Charakter-Klasse, die Sie benötigen, um zu entkommen die wörtliche Bindestrich, außer am Anfang der Klasse oder nach der negation caret-Zeichen, am Ende, nach einem Angebot oder nach und vor der Kurzschrift Charakter-Klasse. In anderen Worten, Sie brauchen nicht zu entkommen, den Bindestrich, wenn die situation ist nicht mehrdeutig, außer für ungültig reicht.\d-.
), so scheint PHP nicht mehr akzeptiert, dass ab der version 7.3.1.Dein Fehler ist abhängig von deiner regex-interpreter.
Können Sie entkommen Bindestrich klar zu sein über seine Verwendung. Bedeutung mit
\-
statt-
.Ihre endgültige code:
Das problem ist wirklich alt, aber es gibt einige neue Entwicklungen im Zusammenhang mit PHP 7.3 und neuere Versionen, die behandelt werden müssen. PHP-PCRE-engine wandert PCRE2, und das ist, wo Rückwärts Inkompatible Änderungen stammen aus:
Bevor PHP 7.3, verwenden Sie den Bindestrich in einer Charakter-Klasse in jeder position, wenn Sie entkommen, oder wenn Sie es "in einer position, wo es nicht interpretiert werden, als Hinweis auf eine Palette". Nun, um den Bindestrich in einen Charakter-Klasse, immer verwenden Sie es entweder am start-oder end-Positionen nur.
Siehe auch diesen Hinweis: