2013-05-14 228 views
0

有点惊讶,但下面...PHP的preg_match '£'

static public function VerifyAndFormatStreet(&$addrStr, $mustExist) 
{ 
    if($addrStr !== NULL) 
    {  
     $addrStr = trim($addrStr); 

     // SNIP 

     if(preg_match('/[^A-Za-z0-9 -.,]/', $addrStr)) 
     { 
      printf("\t### FAIL: BAD CHARS\n"); 
      throw new JEH_IllegalParameterException("Address contains illegal characters"); 
     } 

     $addrStr = ucwords(strtolower($addrStr)); 
     printf("PASS STRING IS NOW $addrStr\n"); 
    } 
    else if($mustExist) 
     throw new JEH_IllegalParameterException("Address must not be empty"); 
} 

下调用失败,找到$street2无效字符...

$pass = FALSE; 
try { JEH_Address::Create("12 Somestreet", "Junk£", "Frlington", "", "Portsmouth", "Hampshire", "UK", "PO1 1XX"); } 
catch(JEH_IllegalParameterException $e) { $pass = TRUE; } 
if(!$pass) die("Was able to detect bad char!!!\n"); 
else   printf("PASS\n"); 

但是,如果我改变preg_match()函数以下函数在Create()函数中... (将空格放在集合的末尾)

if(preg_match('/[^A-Za-z0-9-., ]/', $addrStr)) 

该功能起作用。

任何想法为什么移动字符匹配集中的空间的作品?

回答

5

A-Za-z0-9 -.,包括四个范围

  1. A到Z
  2. a到z
  3. 0到9
  4. [空格]到,

如果移动空间到最后一个变成

0-9-. 

这不是一个有效范围,所以短划线被视为短划线,而不是作为范围的一部分。

+0

这就是为什么我倾向于始终把'-'在我的性格分组结束时,如果我想要一个文字'-'匹配,因为这永远不会产生字符范围。 – ajp15243

+1

@ ajp15243 - 我倾向于逃避任何可能被误解的东西 – andrewsi

+0

Urg yes!谢谢 – Jimbo

4

您需要避开破折号,否则就会像A-Z一样创建一个范围。所以你创建了一个从空间到.的范围来匹配。 (你必须看看它在一个字符表,看看那些是什么。)尝试:

/[^A-Za-z0-9\-., ]/ 
+0

Urg yes!谢谢 – Jimbo