2012-04-04 114 views
0

我得到运行的模式匹配验证以下错误:PregMatch没有结束“)”分隔符发现

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

,我使用已经从网上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$) 

如果我使用添加我的验证规则的这种方法,我得到的错误未知的修饰词“$”: $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$)\)');

我使用它的原始的方式是简写形式: $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是模型的验证实例。如果有任何用处,我正在使用FuelPHP。

+0

这是英国邮政编码,给我的问题(调试后通过注释掉行)。 – 2012-04-04 09:34:53

+0

'$ val-> add()'方法优于'$ val-> add_field()',因为后者使用正则表达式来决定匹配的模式。因此,我的实际错误是未知修饰符。 – 2012-04-04 09:52:21

回答

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')); 

作品像一个魅力我。你需要有分隔符。

0

你的正则表达式需要一个分隔符,例如, /

/(((^[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$)/ 

此分隔符可以是不同的字符,但在此之前,你的正则表达式后,它必须是相同的。你可以例如也做到这一点

~regex~ 

#regex# 

的好处是,使用您没有正则表达式中的分隔符。如果您使用/作为分隔符和想匹配“/”你要逃避它正则表达式/\//里面,如果你改变了分隔符,你可以做#/#匹配一个“/”

+0

我刚刚尝试过,它将缺少的分隔符更改为'/'。如果我使用'〜regex〜',它不认为它是有效的。 – 2012-04-04 09:33:01

+0

请问您可以使用完整的'preg_match'源代码行更新您的问题,我可以准确了解您是如何使用它的? – stema 2012-04-04 09:38:18