PHPEye开源社区 » PHP技术讨论区 » php实现js的escape&unescape
《Programming PHP》第二版上市
2007-9-17 10:31 pdreamer
php实现js的escape&unescape

[code]/**
* js编码实现
*
* @param string $str
* @return string
*/
function escape($str) {
preg_match_all("/[\xc2-\xdf][\x80-\xbf]+|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}|[\x01-\x7f]+/e",$str,$r);
//匹配utf-8字符,
$str = $r[0];
$l = count($str);
for($i=0; $i<$l; $i++){
  $value = ord($str[$i][0]);
  if($value < 223){
   $str[$i] = rawurlencode(utf8_decode($str[$i]));
  //先将utf8编码转换为ISO-8859-1编码的单字节字符,urlencode单字节字符.
  //utf8_decode()的作用相当于iconv("UTF-8","CP1252",$v)。
  }else{
   $str[$i] = "%u".strtoupper(bin2hex(iconv("UTF-8","UCS-2",$str[$i])));
  }
}
return join("",$str);
}
/**
* js解码实现
*
* @param string $str
* @return string
*/
function unescape($str) {
  $str = rawurldecode($str);
  preg_match_all("/%u.{4}|&#x.{4};|&#d+;|.+/U",$str,$r);
  $ar = $r[0];
  foreach($ar as $k=>$v) {
    if(substr($v,0,2) == "%u")
       $ar[$k] = iconv("UCS-2","UTF-8",pack("H4",substr($v,-4)));
    elseif(substr($v,0,3) == "&#x")
       $ar[$k] = iconv("UCS-2","UTF-8",pack("H4",substr($v,3,-1)));
    elseif(substr($v,0,2) == "&#") {
       $ar[$k] = iconv("UCS-2","UTF-8",pack("n",substr($v,2,-1)));
    }
  }
  return join("",$ar);
}[/code]

在php5.2.x下很好,在php5.0.4下要重复两次才行,问题可能在iconv的版本吧,大家说如何解决呢?

页: [1]
查看完整版本: php实现js的escape&unescape


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.