<?php
$str = '0123AbcX this is a test';function getFchar($fKey = null)
{
$fchar   =   Array(
'0'   =>   '0',
'1'   =>   '1',
'2'   =>   '2',
'3'   =>   '3',
'4'   =>   '4',
'5'   =>   '5',
'6'   =>   '6',
'7'   =>   '7',
'8'   =>   '8',
'9'   =>   '9',
'A'   =>   'A',
'B'   =>   'B',
'C'   =>   'C',
'D'   =>   'D',
'E'   =>   'E',
'F'   =>   'F',
'G'   =>   'G',
'H'   =>   'H',
'I'   =>   'I',
'J'   =>   'J',
'K'   =>   'K',
'L'   =>   'L',
'M'   =>   'M',
'N'   =>   'N',
'O'   =>   'O',
'P'   =>   'P',
'Q'   =>   'Q',
'R'   =>   'R',
'S'   =>   'S',
'T'   =>   'T',
'U'   =>   'U',
'V'   =>   'V',
'W'   =>   'W',
'X'   =>   'X',
'Y'   =>   'Y',
'Z'   =>   'Z',
'a'   =>   'a',
'b'   =>   'b',
'c'   =>   'c',
'd'   =>   'd',
'e'   =>   'e',
'f'   =>   'f',
'g'   =>   'g',
'h'   =>   'h',
'i'   =>   'i',
'j'   =>   'j',
'k'   =>   'k',
'l'   =>   'l',
'm'   =>   'm',
'n'   =>   'n',
'o'   =>   'o',
'p'   =>   'p',
'q'   =>   'q',
'r'   =>   'r',
's'   =>   's',
't'   =>   't',
'u'   =>   'u',
'v'   =>   'v',
'w'   =>   'w',
'x'   =>   'x',
'y'   =>   'y',
'z'   =>   'z'
);
return isset($fchar[$fKey])?$fchar[$fKey]:$fchar;
}
function next_fchar($matches)
{
return getFchar($matches[1]);
}
echo  preg_replace_callback(
"/([\xa3\xb0-\xb9|\xa3\xc1-\xFa]{2})/U"
,'next_fchar',
$str); 
?>

解决方案 »

  1.   

    实际上把最后一位减去80(128)就行了,这过程还包含一次判断,放在next_fchar函数里即可.
      

  2.   

    是utf8编码的,上面的代码在utf8下面不成功
      

  3.   

    preg_replace_callback("/([\xEF][\xBC][\x90-\x99]|[\xEF][\xBD][\x81-\x9A\xA1-\xBA])/", 'next_fchar', $str);
    function next_fchar($matches){
      global $queue;
      return $queue[$matches[1]];
    }
    搞定,收工,多谢上面2位