我正在研究一组验证类,目前正在构建用于应用各种验证规则的插件。 我构建了以下用于验证英国邮政编码的类:
class PostcodeUk extends abstr'Prop implements iface'Prop
{
const
/**
* Defines the regular expression against which to test postal code
*
* @see http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation UK postal code validation rules on Wikipedia
*/
PATTERN = '/^(GIR 0AA)|(((A[BL]|B[ABDHLNRSTX]?|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[AEGKLMNOPRSTY]?|T[ADFNQRSW]|UB|W[ADFNRSV]|YO|ZE)[1-9]?[0-9]|((E|N|NW|SE|SW|W)1|EC[1-4]|WC[12])[A-HJKMNPR-Y]|(SW|W)([2-9]|[1-9][0-9])|EC[1-9][0-9]) [0-9][ABD-HJLNP-UW-Z]{2})$/';
/**
*
* @return bool True if valid
* @throws 'InvalidArgumentException
*/
public function isValid ()
{
$valid = false;
$data = $this -> getData ();
switch (gettype ($data))
{
case 'NULL' :
$valid = true;
break;
case 'string' :
$valid = preg_match (static::PATTERN, $data) > 0;
break;
default :
throw new 'InvalidArgumentException (__CLASS__ . ': This property cannot be applied to data of type ' . gettype ($data));
break;
}
return ($valid);
}
}
PostcodeUk::P ATTERN中定义的正则表达式源自维基百科关于英国邮政编码的文章中给出的on。但是,给定的正则表达式会检测包含在较大文本块中的有效邮政编码字符串。 我希望它仅与有效的邮政编码完全匹配,不包括前后字符。 所以(SW1A 0AA
(应该作为有效传递,但(foobarSW1A 0AA
(不应该。
我将锚点添加到正则表达式中(开头为 ^,末尾为 $(,以尝试强制它仅接受仅包含有效邮政编码的字符串。 但是,该类仍然传递带有填充和/或非邮政编码字符串包装的邮政编码。
我做错了什么? 我认为添加锚点足以获得我想要的行为。
将锚点添加为:
^(?:regex)$
^foo|bar$
与^(?:foo|bar)$
不同。
您还应该使用 'z
而不是 $
。 $
允许在字符串末尾使用可选的换行符,而'z
是字符串匹配的严格结尾。