【问题标题】:PregMatch no ending ')' delimiter foundPreg_Match 没有找到结尾 ')' 分隔符
【发布时间】:2012-04-04 09:16:38
【问题描述】:

运行模式匹配验证时出现以下错误:

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

我使用的 PREG 正则表达式取自在线正则表达式库,但我找不到缺少的分隔符在哪里。请问有大神指点一下吗?

检查英国邮政编码:

(((^[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。

【问题讨论】:

  • 英国邮政编码给我带来了问题(在通过注释掉行进行调试之后)。
  • $val->add() 方法优于$val->add_field(),因为后者首先使用正则表达式来确定要匹配的模式。因此,我的实际错误是未知修饰符。

标签: php regex preg-match delimiter


【解决方案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' ) );

对我来说就像一个魅力。您需要设置分隔符。

【讨论】:

    【解决方案2】:

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

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

    优点是,使用正则表达式中没有的分隔符。如果您使用/ 作为分隔符并想要匹配“/”,则必须在正则表达式/\// 中对其进行转义,如果您更改分隔符,您可以使用#/# 来匹配“/”

    【讨论】:

    • 我刚刚尝试过,它将缺少的分隔符更改为“/”。如果我使用~regex~,它不会将其识别为有效。
    • 您能否用完整的preg_match 源代码行更新您的问题,我可以确切地看到您是如何使用它的?
    猜你喜欢
    • 1970-01-01
    • 2016-12-07
    • 2012-03-30
    • 2015-12-24
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 2013-06-15
    相关资源
    最近更新 更多