RegExp: +-Modifier außerhalb eckiger Klammern wird nicht gewertet

Ich habe einen Regulären Ausdruck, um damit bei einer Usereingabe (genauer ein Dateiname) zu prüfen, ob wirklich auch nur A-Z, a-z, der Unterstrich _ , ein Hochkomma ’ oder ein Strich - enthalten ist.

Wenn ich diesen aber mit der Funktion preg_match teste, wird mir bei allen Strings true (1) zurückgegeben:

[PHP]
$allowed_chars_regex = „/[a-zA-Z_-']+/“ ;

#=> Hier sollte false herauskommen, es kommt jedoch true
echo (preg_match($allowed_chars_regex, „öl%&/“));

#=> Hier kommt richtigerweise true heraus
echo (preg_match($allowed_chars_regex, „rollo“));[/PHP]

Die RegExp muss jedoch stimmen, denn wenn ich sie auf RegExr: Online Regular Expression Testing Tool an beiden Strings teste, werden die richtigen Gruppen markiert.

Woran kann das liegen?

in beiden Zeichenketten kommen Buchstaben vor, du musst im ersten Fall das l rausnehmen.

Negier einfach deinen RegEx:

[php]$allowed_chars_regex = „/[^a-zA-Z_-']+/“;
// ^— Damit wird alles gematcht, was nicht zu dem nachfolgenden gehört[/php]
(ungetestet)

Natürlich müsstest du dann entsprechend die Negation der Rückgabe von preg_match zurückgeben.

Es scheint, als hätte ich meine eigene RegExp bzw. den Aspekt nicht verstanden, dass nur ein Match dem RegExp entsprechen muss.

Und deswegen danke an struppi, aufgrunddessen mir eingeleuchtet ist, warum es nicht funktioniert und auch an Commodore, weil ich nun nicht nach einer funktionierenden Lösung mehr suchen muss (:

Ums nochmal klar zu machen

[PHP]$allowed_chars_regex = „/[a-zA-Z_-']+/“ ;

#=> Hier sollte false herauskommen, es kommt jedoch true
echo (preg_match($allowed_chars_regex, „öl%&/“));[/PHP]

Dein Code ist schon richtig. Allerdings sagst du, dass an beliebieger Stelle mindestens eines der Zeichen a-z, A-z _ - und ’ vorkommen muss.
Folglich stimmt die bedingung, denn in öl%&/ kommt ein „l“ vor, dass auf diese Bedindung passt.

Was du im regex vergessen hast ist folgendes
[PHP]
$allowed_chars_regex = „/[1]+/$“ ;
[/PHP]

Damit sagst du ihm, dass deine Zeichenkette von ANFANG (^) bis zum ENDE ($) zutreffen muss, und nicht wie ich oben schrieb, nur ein beliebiger Teil.


  1. a-zA-Z_-’ ↩︎

[php]$allowed_chars_regex = „/[1]+$/“;[/php]
// 1 Fehler behoben


  1. a-zA-Z_-’ ↩︎