preg_match_all()的奇怪行为

时间:2012-11-09 17:55:42

标签: php regex 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,但函数输出奇怪的结果与这样的RegEx。我使用PHP 5.4

1 个答案:

答案 0 :(得分:2)

尝试添加Unicode标志:

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

这是因为۱实际上是几个字节长。就它而言,它是无害的,因为那些确切的字节要么是符号,要么是巧合的单个字节。但是,在字符类中,任何单个字节都可以匹配其他字符中的任何单个字节,这是因为它们在地图中靠得很近。