为什么我用ord()函数输出这十个数字结果都是226?
使用正则匹配$ii = preg_match("/[①②③④⑤⑥⑦⑧⑨⑩]{3}/",$hh);可以匹配成功,如果不指定{3}就匹配不成功,文件格式是utf-8格式的。
使用正则preg_match_all("/[①②③④⑤⑥⑦⑧⑨⑩]{3}[\x40-\xfe]*。/",$hh,$jj);
$hh="①分别用在两个动作前面,表示动作或情况一经发生就不改变:~定~易│~去~返│~蹶~振。\n②分别用在一个名词和一个动词前面,表示强调或夸张:~言~发│~字~漏│~钱~值│~毛~拔。"
匹配结果为:Array ( [0] => Array ( [0] => ①分别用在两个动作前面,表示动作或情况一经发生就不改变:~定~易│~去~返│~蹶~振。\n②分别用在一个名词和一个动词前面,表示强调或夸张:~言~发│~字~漏│~钱~值│~毛~拔。 ) ) 
请教高手这种情况该如何处理呢?

解决方案 »

  1.   

    ord() 函数返回字符串第一个字符的 ASCII 值。echo strlen('⑤'); //3$hh="①分别用在两个动作前面,表示动作或情况一经发生就不改变:~定~易│~去~返│~蹶~振。\n②分别用在一个名词和一个动词前面,表示强调或夸张:~言~发│~字~漏│~钱~值│~毛~拔。";
    $ii = preg_match("/[①②③④⑤⑥⑦⑧⑨⑩]/",$hh);//可以匹配
    echo $ii;
    preg_match_all("/[①②③④⑤⑥⑦⑧⑨⑩][\x40-\xfe]*。/",$hh,$jj);print_r($jj);页面输出/*******
    31Array ( [0] => Array ( [0] => ①分别用在两个动作前面,表示动作或情况一经发生就不改变:~定~易│~去~返│~蹶~振。 [1] => ②分别用在一个名词和一个动词前面,表示强调或夸张:~言~发│~字~漏│~钱~值│~毛~拔。 ) ) ********/
      

  2.   

    preg_match_all("/[①②③④⑤⑥⑦⑧⑨⑩].*/uU",$hh,$jj);
    ord返回的是单个字节的ASCII数值,在多字节的情况下只计算返回第一个字节
    对于这十个字符,utf-8都是3字节的编码,并且第一个字节ascii值都是226
      

  3.   


    sorry!
    preg_match_all("/[①②③④⑤⑥⑦⑧⑨⑩].*/u",$hh,$jj);用贪婪模式,原来用了非贪婪,只匹配了符号
      

  4.   

    本帖最后由 xuzuning 于 2011-05-26 16:41:11 编辑