2012-04-04 7 views
0

ich folgende Fehlermeldung erhalten ein Pattern-Matching-Validierung ausgeführt wird:PregMatch keine Endung ‚)‘ Begrenzer gefunden

ErrorException [ Warning ]: preg_match() [function.preg-match]: No ending matching delimiter ')' found 

Die PREG regex, die ich benutze ist aus auf Online-regex Bibliothek genommen worden, aber ich kann nicht finden, wo das fehlende Trennzeichen ist. Kann jemand bitte darauf hinweisen?

Checks UK Postleitzahlen:

(((^[BEGLMNS][1-9]\d?)|(^W[2-9])|(^(A[BL]|B[ABDHLNRST]|C[ABFHMORTVW]|D[ADEGHLNTY]|E[HNX]|F[KY]|G[LUY]|H[ADGPRSUX]|I[GMPV]|JE|K[ATWY]|L[ADELNSU]|M[EKL]|N[EGNPRW]|O[LX]|P[AEHLOR]|R[GHM]|S[AEGKL-PRSTWY]|T[ADFNQRSW]|UB|W[ADFNRSV]|YO|ZE)\d\d?)|(^W1[A-HJKSTUW0-9])|(((^WC[1-2])|(^EC[1-4])|(^SW1))[ABEHMNPRVWXY]))(\s*)?([0-9][ABD-HJLNP-UW-Z]{2}))$|(^GIR\s?0AA$) 

Wenn ich diese Methode der Zugabe meine Gültigkeitsregel verwenden, erhalte ich den Fehler unbekannt Modifikator ‚$‘: $val->add('post_code', 'post code') ->add_rule('required') ->add_rule('match_pattern', '(((^[BEGLMNS][1-9]\d?)|(^W[2-9])|(^(A[BL]|B[ABDHLNRST]|C[ABFHMORTVW]|D[ADEGHLNTY]|E[HNX]|F[KY]|G[LUY]|H[ADGPRSUX]|I[GMPV]|JE|K[ATWY]|L[ADELNSU]|M[EKL]|N[EGNPRW]|O[LX]|P[AEHLOR]|R[GHM]|S[AEGKL-PRSTWY]|T[ADFNQRSW]|UB|W[ADFNRSV]|YO|ZE)\d\d?)|(^W1[A-HJKSTUW0-9])|(((^WC[1-2])|(^EC[1-4])|(^SW1))[ABEHMNPRVWXY]))(\s*)?([0-9][ABD-HJLNP-UW-Z]{2}))$|(^GIR\s?0AA$)\)');

Die ursprüngliche Art, wie ich es wurde mit war die Kurzversion: $val->add_field('post_code', 'post code', 'required|match_pattern[(((^[BEGLMNS][1-9]\d?)|(^W[2-9])|(^(A[BL]|B[ABDHLNRST]|C[ABFHMORTVW]|D[ADEGHLNTY]|E[HNX]|F[KY]|G[LUY]|H[ADGPRSUX]|I[GMPV]|JE|K[ATWY]|L[ADELNSU]|M[EKL]|N[EGNPRW]|O[LX]|P[AEHLOR]|R[GHM]|S[AEGKL-PRSTWY]|T[ADFNQRSW]|UB|W[ADFNRSV]|YO|ZE)\d\d?)|(^W1[A-HJKSTUW0-9])|(((^WC[1-2])|(^EC[1-4])|(^SW1))[ABEHMNPRVWXY]))(\s*)?([0-9][ABD-HJLNP-UW-Z]{2}))$|(^GIR\s?0AA$)\)]');

$val ist eine Validierungsinstanz eines Modells. Ich benutze FuelPHP, wenn das nützlich ist.

+0

Es ist der UK Post Code, der mir die Probleme gibt (nach dem Debuggen durch Auskommentieren von Zeilen). –

+0

Die '$ val-> add()' Methode ist besser als die '$ val-> add_field()', weil letztere Regex verwendet, um das Muster zu bestimmen, das an erster Stelle steht. Daher ist mein tatsächlicher Fehler ein unbekannter Modifikator. –

Antwort

1
<?php 
$regex = '/(((^[BEGLMNS][1-9]\d?)|(^W[2-9])|(^(A[BL]|B[ABDHLNRST]|C[ABFHMORTVW]|D[ADEGHLNTY]|E[HNX]|F[KY]|G[LUY]|H[ADGPRSUX]|I[GMPV]|JE|K[ATWY]|L[ADELNSU]|M[EKL]|N[EGNPRW]|O[LX]|P[AEHLOR]|R[GHM]|S[AEGKL-PRSTWY]|T[ADFNQRSW]|UB|W[ADFNRSV]|YO|ZE)\d\d?)|(^W1[A-HJKSTUW0-9])|(((^WC[1-2])|(^EC[1-4])|(^SW1))[ABEHMNPRVWXY]))(\s*)?([0-9][ABD-HJLNP-UW-Z]{2}))$|(^GIR\s?0AA$)/'; 

var_dump(preg_match($regex, 'M1 1AA'), preg_match($regex, 'not valid')); 

wirkt wie ein Zauber passen für mich. Sie müssen Trennzeichen an Ort und Stelle haben.

0

Ihre Regex benötigt einen Begrenzer, z. /

/(((^[BEGLMNS][1-9]\d?)|(^W[2-9])|(^(A[BL]|B[ABDHLNRST]|C[ABFHMORTVW]|D[ADEGHLNTY]|E[HNX]|F[KY]|G[LUY]|H[ADGPRSUX]|I[GMPV]|JE|K[ATWY]|L[ADELNSU]|M[EKL]|N[EGNPRW]|O[LX]|P[AEHLOR]|R[GHM]|S[AEGKL-PRSTWY]|T[ADFNQRSW]|UB|W[ADFNRSV]|YO|ZE)\d\d?)|(^W1[A-HJKSTUW0-9])|(((^WC[1-2])|(^EC[1-4])|(^SW1))[ABEHMNPRVWXY]))(\s*)?([0-9][ABD-HJLNP-UW-Z]{2}))$|(^GIR\s?0AA$)/ 

Dieses Trennzeichen können verschiedene Zeichen sein, aber es muss die gleiche vor und nach dem regulären Ausdruck sein. Sie könnten z.B. auch tun dies

~regex~ 

oder

#regex# 

Der Vorteil ist, verwenden Sie ein Trennzeichen, das Sie nicht in der Regex haben. Wenn Sie / als Trennzeichen verwenden möchten „/“ entsprechen haben Sie es in der regex /\// zu entkommen, wenn Sie das Trennzeichen ändern könnten Sie #/# tun ein „/“

+0

Ich habe gerade versucht, und es ändert das fehlende Trennzeichen in '/'. Wenn ich '~ regex ~' verwende, erkennt es es nicht als gültig. –

+0

Können Sie bitte Ihre Frage mit der vollständigen 'preg_match' Zeile des Quellcodes aktualisieren, damit ich genau sehen kann, wie Sie sie benutzen? – stema