加入收藏 | 设为首页 | 会员中心 | 我要投稿 济源站长网 (https://www.0391zz.cn/)- 数据工具、数据仓库、行业智能、CDN、运营!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

分析php中的escape函数

发布时间:2022-07-22 10:35:04 所属栏目:PHP教程 来源:互联网
导读:采用js对URL中的汉字进行escape编码。 a href= onclick=window.open(product_list.php?p_sort=+escape(脚本之家));这样点击链接后的效时: 引用:http://127.0.0.1/shop/product_list.php?p_sort=PHP%u5F00%u53D1%u8D44%u6E90%u7F51 生成了这样的效果, 很明
  采用js对URL中的汉字进行escape编码。
 
  <a href="" onclick="window.open('product_list.php?p_sort='+escape('脚本之家'));">这样点击链接后的效时:
 
  引用:http://127.0.0.1/shop/product_list.php?p_sort=PHP%u5F00%u53D1%u8D44%u6E90%u7F51
 
  生成了这样的效果, 很明显用PHP的urldecode()或者base64_decode()是无法反解的。
 
  解决方法, 用PHP写一个反解函数:
 
  复制代码 代码如下:
 
  function js_unescape($str){
 
  $ret = '';
 
  $len = strlen($str);
 
  for ($i = 0; $i < $len; $i++)
 
  {
 
  if ($str[$i] == '%' && $str[$i+1] == 'u')
 
  {
 
  $val = hexdec(substr($str, $i+2, 4));
 
  if ($val < 0x7f) $ret .= chr($val);
 
  在 json中不支持中文,用它传送中文数据就会出现数据丢失或者乱码,必须在传 送前对要发送的字符串进行编码,由于传送过去需要用js进行数据解析,考虑到js中有unescape函数,故若在php中有个escape函数,对数据 进行编码,在客户端用unescape进行 解码,这样就会方便很多。
 
  先在网上搜索一把,很多用php实现的escape函数,大同小异,比如下面一个:
 
  复制代码 代码如下:
 
  function phpEscape($str) {
 
  preg_match_all("/[x80-xff].|[x01-x7f]+/",$str,$r);
 
  $ar = $r[0];
 
  foreach($ar as $k=>$v) {
 
  if(ord($v[0]) < 128)
 
  $ar[$k] = rawurlencode($v);
 
  else
 
  $ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v));
 
  }
 
  return join("",$ar);
 
  }
 
  这个函数可以很好的工作,但是,也许有新手不理解这个函数的原理(比如我),用起来总是不放心,现在我就来解释一下这个函数的原理。而且我认为,拿别人的代码来复用,好比站在了巨人的肩膀上,但是若不理解别人的代码,迟早要掉到地面上。
 
  第一句:preg_match_all("/[x80- xff].|[x01-x7f]+/",$str,$r);这个是用正则表达式匹配 字符串中所有的字符,[x80-xff]. 匹配的是汉字,x表示匹配字符的16进制编码,[ ] 是类选择符,“.” 表示任意一个字符,这样[x80-xff].匹配的是两个字符,其中第一个就是16进制从80到ff的字符,而这恰好就是汉字编码的第一个字符。这样 就能完整的匹配一个汉字。关于unicode中汉字的编码,大家可以到网上搜索一下。同理,[x01-x7f]+英文字符串,因为最早的英文是 ASCII编码,编码值小于128,也就是16进制的从01到7f,"+"表示一个或者多个字符,这样[x01-x7f]+就能匹配连续多个英文字符 串。
 
  复制代码 代码如下:
 
  $ar = $r[0]; //$r[0]里存放是匹配到的数组
 
  foreach($ar as $k=>$v) {
 
  if(ord($v[0]) < 128) //假如字符编码值小于128,说明是个英文字符
 
  $ar[$k] = rawurlencode($v); //直接用rawurlencode编码
 
  else
 
  $ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v)); //否则的话用iconv函数把汉字转变成ucs-2编码,也就是unicode编码
 
  }
 
  在javascript中就可以用unescape来解码了
 
  u0391-uFFE5 和u4e00-u9fa5来匹配中文
 
  但好像前者包含汉字下的A-¥等 后者可能是纯汉字。
 
  其中解码函数为:
 
  复制代码 代码如下:
 
  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) 
 
  }
 
  return join("",$ar);
 
  }。
 

(编辑:济源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读