2013-05-14 227 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