2012-10-15 48 views
1

任何人都知道如何用preg_replace和e/modifier修改此函数e /修饰符将被折旧。替代函数preg_replace e/modifier

function charset_decode_utf_8 ($string) { 
     /* Only do the slow convert if there are 8-bit characters */ 
    /* avoid using 0xA0 (\240) in ereg ranges. RH73 does not like that */ 
    if (! preg_match("/[\200-\237]/", $string) and ! preg_match("/[\241-\377]/", $string)) 
     return $string; 

    // decode three byte unicode characters 
    $string = preg_replace("/([\340-\357])([\200-\277])([\200-\277])/e", 
    "'&#'.((ord('\\1')-224)*4096 + (ord('\\2')-128)*64 + (ord('\\3')-128)).';'", 
    $string); 

    // decode two byte unicode characters 
    $string = preg_replace("/([\300-\337])([\200-\277])/e", 
    "'&#'.((ord('\\1')-192)*64+(ord('\\2')-128)).';'", 
    $string); 

return $string; 
} 
+4

['preg_replace_callback'](http://php.net/preg_replace_callback) –

+0

此外都跟上述代码是做:http://stackoverflow.com/questions/12848091/convert- unicode-characters-127以上至十进制/ 12848889#12848889 – DaveRandom

回答

2
<?php 
$string = preg_replace_callback("/([\340-\357])([\200-\277])([\200-\277])/", 
    function($arr) { 
     $val = (ord($arr[1]) - 224) * 4096 
       + (ord($arr[2]) - 128) * 64 
       + (ord($arr[3]) - 128); 
     return "&#" . $val . ";"; 
    }, $string); 


$string = preg_replace_callback("/([\300-\337])([\200-\277])/", 
    function($arr) 
    { 
     $val = (ord($arr[1]) - 192) * 64 + ord($arr[2]) - 128; 
     return "&#" . $val . ";"; 
    }, $string); 
+0

谢谢Tim。这有效,你忘了一个; $ val后。 “;” – ceasar