2 Stimmen

Regex-Match schlägt fehl, wenn Sonderzeichen hinzugefügt werden

Denk darüber nach,

$uri = '/post/search/foo';

$pattern = '~/post/search/[A-Za-z0-9_-]+(?=/|$)~i';

$matches = array();

preg_match($pattern, $uri, $matches);

print_r($matches); // Erfolg

Es funktioniert gut, da [A-Za-z0-9_-] zu foo gehört. Da ich ein Routen-Plugin schreibe, möchte ich, dass dies auch spezielle Zeichen matchen kann.

Ich stelle mir das Regex-Muster so vor:

[A-Z0-9!@#$%^&*()_+|\/?><~";:'*]+(?=/|$)

Ich habe versucht, jedes Sonderzeichen mit einem Schrägstrich zu escapen und das gesamte Muster mit preg_quote() zu escapen, aber ohne Erfolg - ich stoße immer auf Kompilierungsfehler.

Die Frage ist, wie ein korrektes Matching für A-Z0-9!@#$%^&*()_+|\/?><~";:'* durchgeführt werden sollte?

2voto

Jon Lin Punkte 139414

Gibt es einen Grund, warum Sie nicht einfach ein unermüdliches . verwenden möchten?

So wie:

'~/post/search/.+(?=/|$)~iU'

2voto

stema Punkte 85725

Das Escapen innerhalb der Zeichenklasse ist nicht schwierig, nur ^ (nur an erster Position), - (nicht an erster oder letzter Position), \ und [] sind dort spezielle Zeichen und ' als String-Begrenzer. Zusätzlich der Regex-Begrenzer.

Sie verwenden ~ als Regex-Begrenzer und ich denke, dass dies der kritische Punkt in Ihrer Zeichenklasse ist, da der Begrenzer standardmäßig nicht beim Verwenden von preg_quote() escapet wird.

Daher sollte dies funktionieren

[A-Z0-9!@#$%^&*()_+|\/?><\~";:\'*]+(?=/|$)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X