2012-11-09 22 views
0

以下代碼:奇怪preg_match_all()的行爲

$string ='۱۲۳۴۵۶۷۸۹۰'; 
    $regex ='@۱@'; 
    preg_match_all($regex,$string,$match); 
    var_dump($match); 

將輸出:

array(1) { 
     [0] => 
     array(1) { 
     [0] => 
     string(2) "۱" 
     } 
    } 

$regex2 ='@[۱]@'; 
    preg_match_all($regex2,$string,$match); 
    var_dump($match); 

將輸出

array (size=1) 
    0 => 
    array (size=11) 
     0 => string '�' (length=1) 
     1 => string '�' (length=1) 
     2 => string '�' (length=1) 
     3 => string '�' (length=1) 
     4 => string '�' (length=1) 
     5 => string '�' (length=1) 
     6 => string '�' (length=1) 
     7 => string '�' (length=1) 
     8 => string '�' (length=1) 
     9 => string '�' (length=1) 
    10 => string '�' (length=1) 

事實上,我想要使用正則表達式,如[۱۲۳۴۵۶۷۸۹۰]‍‍‍‍‍‍,但該函數會輸出這樣的RegEx的奇怪結果。我使用PHP 5.4

回答

2

嘗試添加統一標誌:

$regex = '@[۱]@u'; 

這樣做的原因是因爲۱實際上是幾個字節長。在它自己的情況下,它是無害的,因爲那些確切的字節或者是符號,或者是偶然存在的單個字節。但是,在字符類中,任何單個字節都可能與其他字符中的任何單個字節匹配,這是因爲它們在地圖中靠近在一起。