如何处理JSON中的特殊字符


Posted in Javascript onNovember 30, 2016

JSON 是适用于 Ajax 应用程序的一种有效格式,原因是它使 JavaScript 对象和字符串值之间得以快速转换。由于 Ajax 应用程序非常适合将纯文本发送给服务器端程序并对应地接收纯文本,相比不能生成文本的 API,能生成文本的 API 自然更可取;而且,JSON 让您能够处理本地 JavaScript 对象,而无需为如何表示这些对象多费心思。

XML 也可以提供文本方面的类似益处,但用于将 JavaScript 对象转换成 XML 的几个现有 API 没有 JSON API 成熟;有时,您必须在创建和处理 JavaScript 对象时格外谨慎以确保所进行的处理能与所选用的 XML 会话 API 协作。但对于 JSON,情况就大不相同:它能处理几乎所有可能的对象类型,并会返回给您一个非常好的 JSON 数据表示。 因此,JSON 的最大价值在于可以将 JavaScript 真的作为 JavaScript 而非数据格式语言进行处理。

您所学到的所有有关使用 JavaScript 对象的技巧都可以应用到代码中,而无需为如何将这些对象转变成文本而多费心思。

1. 回车问题

JSON传值的时候,如果有回车符就会挂的。我们可以使用正则来去掉回车符:

$str = preg_replace("'([\r\n])[\s]+'", "", $str); 

 // 不用正则 

 $str = str_replace("\n","",$str);

转出来的字符串就没有回车符的困扰了。

顺便记录一个PHP过滤脚本:

<?php 

 // $document 应包含一个 HTML 文档。 

// 本例将去掉 HTML 标记,javascript 代码 

// 和空白字符。还会将一些通用的 

 // HTML 实体转换成相应的文本。 

 $search = array ("'<script[^>]*?>.*?</script>'si", // 去掉 javascript 

         "'<[\/\!]*?[^<>]*?>'si",      // 去掉 HTML 标记 

         "'([\r\n])[\s]+'",         // 去掉空白字符 

         "'&(quot|#34);'i",         // 替换 HTML 实体 

         "'&(amp|#38);'i", 

         "'&(lt|#60);'i", 

         "'&(gt|#62);'i", 

         "'&(nbsp|#160);'i", 

         "'&(iexcl|#161);'i", 

         "'&(cent|#162);'i", 

         "'&(pound|#163);'i", 

         "'&(copy|#169);'i", 

         "'&#(\d+);'e");          // 作为 PHP 代码运行 

 $replace = array ("", 

          "", 

          "\\1", 


          "\"",
          "&", 

          "<", 

          ">", 

          " ", 

         chr(161), 

          chr(162), 

          chr(163), 

         chr(169), 

          "chr(\\1)"); 

 $text = preg_replace ($search, $replace, $document); 

 ?>

2. HTML特殊字符

从服务器端以JSON格式将数据传递到客户端后,通过JS显示在HTML页面时,有一些特殊字符不能直接显示,如后台传递过来的是 '<b>msg</b> #' 通过JS显示在HTML页面中时,显示成了 msg # ,并不是msg #,这是由于<与>之间的内容看作是HTML标签了,而以&开头的 与#为HTML实体,所以显示不正常。

解决办法很简单,在JS将其渲染到HTML页面前转换一下即可:

<script type="text/javascript">  

 var str = '<b>msg</b> #';  

 document.all.div1.innerHTML='<pre>'+str+'</pre>';  

 //js中的字符串正常显示在HTML页面中 
 String.prototype.displayHtml= function(){  

   //将字符串转换成数组 
   var strArr = this.split('');  

   //HTML页面特殊字符显示,空格本质不是,但多个空格时浏览器默认只显示一个,所以替换  

   var htmlChar="&<>";  

   for(var i = 0; i< str.length;i++){ 
     //查找是否含有特殊的HTML字符  

     if(htmlChar.indexOf(str.charAt(i)) !=-1){  

       //如果存在,则将它们转换成对应的HTML实体 
       switch (str.charAt(i)) {              

         case '<':  

           strArr.splice(i,1,'<');  

           break;  

        case '>':  

           strArr.splice(i,1,'>');  

           break;  

         case '&':  

           strArr.splice(i,1,'&');  

       }  
     }  

   }  

  return strArr.join('');  

 }  
 alert(str.displayHtml());  
 document.all.div2.innerHTML=str.displayHtml();  

</script>

3. escape()函数

该函数可以处理空格、斜线和其他任何可能影响浏览器的内容,并将它们转换成 Web 可用字符(比如,空格会被转换成 %20,浏览器并不会将其视为空格处理,而是不做更改,将其直接传递到服务器)。之后,服务器会(通常自动)再把它们转换回它们传输后的本来 “面目”。

var url = "nowamagic.php?people=" + escape(people.toJSONString()); 

 request.open("GET", url, true); 

request.onreadystatechange = updatePage; 

request.send(null);

这种做法的缺点有两个: 在使用 GET 请求发送大块数据时,对 URL 字符串有长度限制。虽然这个限制很宽泛,但对象的 JSON 字符串表示的长度可能超出您的想象,尤其是在使用极其复杂的对象时更是如此。在跨网络以纯文本发送所有数据的时候,发送数据面临的不安全性超出了您的处理能力。

简言之,以上是 GET 请求的两个限制,而不是简单的两个与 JSON 数据相关的事情。在想要发送用户名和姓之外的更多内容,比如表单中的选择时,二者可能会需要多加注意。若要处理任何机密或极长的内容,可以使用 POST 请求。

4. 引号问题

JSON中如果包含引号或双引号,会破坏JSON的格式。有两种方法可以解决。

在入库的时候可以使用addslashes()函数处理一下字符串,给引号前加上斜杠。被改的字符包括单引号 (')、双引号 (")、反斜线 backslash (\) 以及空字符NULL。

$text = addslashes($text); 

JavaScript的话,可以这样:

 function valueReplace(v){ 

 v=v.toString().replace(new RegExp('(["\"])', 'g'),"\\\""); 

return v; 

 } 

 var eValue = encodeURI($.trim(valueReplace(e.value)))

就总结到这里。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
始终在屏幕中间显示Div的代码(css+js)
Mar 10 Javascript
JavaScript内核之基本概念
Oct 21 Javascript
Bootstrap Navbar Component实现响应式导航
Oct 08 Javascript
微信小程序 商城开发(ecshop )简单实例
Apr 07 Javascript
JS 组件系列之 bootstrap treegrid 组件封装过程
Apr 28 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
Jul 02 Javascript
AngularJS ionic手势事件的使用总结
Aug 09 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
Mar 08 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
Jul 18 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
Jul 19 Javascript
小程序实现上下移动切换位置
Sep 23 Javascript
JavaScript switch语句使用方法简介
Dec 30 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
Nov 30 #Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
Nov 30 #Javascript
浅析JavaScript中break、continue和return的区别
Nov 30 #Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
Nov 30 #Javascript
浅析script标签中的defer与async属性
Nov 30 #Javascript
JavaScript 字符串常用操作小结(非常实用)
Nov 30 #Javascript
js实现表单提交后不重新刷新当前页面
Nov 30 #Javascript
You might like
php时间不正确的解决方法
2008/04/09 PHP
php discuz 主题表和回帖表的设计
2009/03/13 PHP
PHP中用接口、抽象类、普通基类实现“面向接口编程”与“耦合方法”简述
2011/03/23 PHP
PHP利用MySQL保存session的实现思路及示例代码
2014/09/09 PHP
php限制ip地址范围的方法
2015/03/31 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
如何实现iframe(嵌入式帧)的自适应高度
2006/07/26 Javascript
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
2007/07/21 Javascript
JS判断页面加载状态以及添加遮罩和缓冲动画的代码
2012/10/11 Javascript
jQuery中setTimeout的几种使用方法小结
2013/04/07 Javascript
JS选项卡动态替换banner图片路径的方法
2015/05/11 Javascript
第五章之BootStrap 栅格系统
2016/04/25 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
XMLHttpRequest Level 2 使用指南
2016/08/26 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
js中的DOM模拟购物车功能
2017/03/22 Javascript
详解微信小程序设置底部导航栏目方法
2017/06/29 Javascript
createObjectURL方法实现本地图片预览
2019/09/30 Javascript
微信小程序 接入腾讯地图的两种写法
2021/01/12 Javascript
[52:02]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第一场 11.27
2020/11/30 DOTA
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
让Django支持Sql Server作后端数据库的方法
2018/05/29 Python
Python常用爬虫代码总结方便查询
2019/02/25 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
2019/04/06 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
2019/04/12 Python
详解python函数的闭包问题(内部函数与外部函数详述)
2019/05/17 Python
python把转列表为集合的方法
2019/06/28 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
基于python连接oracle导并出数据文件
2020/04/28 Python
上海天奕面试题笔试题
2015/04/19 面试题
租房合同协议书
2014/04/09 职场文书
养牛场项目建议书
2014/05/13 职场文书
煤矿安全协议书
2014/08/20 职场文书
三方股东合作协议书
2014/10/28 职场文书
雷锋之歌观后感
2015/06/10 职场文书
html2 canvas svg不能识别的解决方案
2021/06/03 HTML / CSS