将HTML的左右尖括号等转义成实体形式的两种实现方式

   这篇文章主要介绍了将HTML的左右尖括号等转义成实体形式的两种实现方式,需要的朋友可以参考下

  前端开发工作中,经常需要将HTML的左右尖括号等转义成实体形式。我们不能把<,>,&等直接显示在最终看到的网页里。需要将其转义后才能在网页上显示。

  转义字符(Escape Sequence)也称字符实体(Character Entity)。定义转义字符串的主要原因是

  “<”和“>”等符号已经用来表示HTML TAG,因此不能直接当作文本中的符号来使用。但有时需求是在HTML页面上使用这些符号,所以需要定义它的转义字符串。

  有些字符在ASCII字符集中没有定义(如版权符号“”)。因此需要使用转义字符(“”对应的转义字符是“”)来表示。

  这里提供两个函数escape和unescape,分别实现将HTML转义为实体和回转。

  方式一、一个映射表+正则替换

  代码如下:

  var keys = Object.keys || function(obj) {

  obj = Object(obj)

  var arr = []

  for (var a in obj) arr.push(a)

  return arr

  }

  var invert = function(obj) {

  obj = Object(obj)

  var result = {}

  for (var a in obj) result[obj[a]] = a

  return result

  }

  var entityMap = {

  escape: {

  '&': '&',

  '<': '<',

  '>': '>',

  '"': '"',

  "'": '''

  }

  }

  entityMap.unescape = invert(entityMap.escape)

  var entityReg = {

  escape: RegExp('[' + keys(entityMap.escape).join('') + ']', 'g'),

  unescape: RegExp('(' + keys(entityMap.unescape).join('|') + ')', 'g')

  }

  // 将HTML转义为实体

  function escape(html) {

  if (typeof html !== 'string') return ''

  return html.replace(entityReg.escape, function(match) {

  return entityMap.escape[match]

  })

  }

  // 将实体转回为HTML

  function unescape(str) {

  if (typeof str !== 'string') return ''

  return str.replace(entityReg.unescape, function(match) {

  return entityMap.unescape[match]

  })

  }

  方式二、利用浏览器DOM API

  代码如下:

  // 将HTML转义为实体

  function escape(html){

  var elem = document.createElement('div')

  var txt = document.createTextNode(html)

  elem.appendChild(txt)

  return elem.innerHTML;

  }

  // 将实体转回为HTML

  function unescape(str) {

  var elem = document.createElement('div')

  elem.innerHTML = str

  return elem.innerText || elem.textContent

  }

  有个缺陷是只能转义“< > & ”,对于单引号,双引号都不转义。另外一些非ASCII也不能转义。选择时须注意。

  比较:

  方式1 代码量较大,但灵活性,完整性都比方式2强。可根据需求添加或减少映射表entityMap,且可以运行在任意JS环境中。

  方式2 为hack方式,代码量少很多,利用浏览器内部API就行了转义和转回(主流浏览器都支持)。不具完整性,很明显只能在浏览器环境中使用(比如不能在Node.js中跑)。

时间: 2024-07-31 10:56:02

将HTML的左右尖括号等转义成实体形式的两种实现方式的相关文章

php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符

 PHP使用正则表达式提取字符串中尖括号<>.小括号().中括号[].大括号{}中的字符示例,需要的朋友可以参考下    代码如下: $str="你好<我>(爱)[北京]{天安门}";    echo f1($str); //返回你好  echo f2($str); //返回我  echo f3($str); //返回爱  echo f4($str); //返回北京  echo f5($str); //返回天安门    function f1($str)  { 

java-JAVA中的泛型,尖括号里可以装任意符号?

问题描述 JAVA中的泛型,尖括号里可以装任意符号? 泛型的尖括号里不是装指定类型的嘛,那下面这句笔记怎么理解呢? 泛型的语法------> Class Demo <泛型符号> { } //这里的泛型符号可以用任意符号,常用的符号有E(元素element简写),T(类 型type的简写),K(键key的简写),V(值value的简写) 解决方案 java泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方

c++-模板实例化的时候,尖括号可以省略吗?

问题描述 模板实例化的时候,尖括号可以省略吗? 1.为什么有些地方我看见省略了,有些地方不能省略 2.函数模板的非类型参数可以当做形参,传入函数吗,这样实例的时候直接在参数列表中赋值 如图 解决方案 (1)关键看省略了会不会引起歧义,比如说 T foo() 你调用foo()没办法知道T是什么类型 void foo(T x) 你调用foo(1),自然T就是int. 再比如 void foo(T x) void foo(A x) 构成重载,其中A是一个非模板的版本 A a; foo(a);如果你这么

用js处理xml报文里面的尖括号&amp;amp;lt;问题

问题描述 现在有这样的一个问题..xml报文如下.. <Param><ParamId>2918021984</ParamId> <ParamName>测试呀</ParamName> <Value>第<12>街and第<123>号</Value></Param> 问题 怎么用js正则表达式 把 vlaue 里面的 尖括号 替换成[] < 替换为[ > 替换为] 解决方案 如果有

asp 过滤尖括号内所有内容的正则代码_应用技巧

当然这应该属于正常过滤手法,而还有一种过滤HTML标签的最终极手法,则是将一对尖括号及尖括号中的所有字符均替换不显示,该方法对于内容中必须描述有关尖括号内容过滤过头了. 不过,总归是有需要将所有尖括号中内容全部替换的时候,很显然是需要进行正则的,有两种代码,第一种如下: 复制代码 代码如下: Function nohtml(str) dim re Set re=new RegExp re.IgnoreCase =true re.Global=True re.Pattern="(\<.[^\

使用JS正则表达式 替换括号,尖括号等_javascript技巧

如下所示: function toTxt(str) { var RexStr = /\<|\>|\"|\'|\&/g str = str.replace(RexStr, function(MatchStr) { switch (MatchStr) { case "<": return "<"; break; case ">": return ">"; break; case

使用尖括号和契约优先开发有何关联

本文讲的是使用尖括号和契约优先开发有何关联,[IT168 资讯]契约优先的需求来自于信息状态的规范表示,这些信息主要以Web服务请求的方式流动.大部分主流语言有支持WSDL和XSD的工具,以及用这些信息"契约"来描述Schema和WSDL,而这种方式作为一种可互操作的解决方案是否可靠则存在着争议. 契约优先的开发方式解决对象和XML之间的阻抗失配.由于Xml Schema语言的描述格式格外丰富,所以用它对协议建模需要考虑降低序列化和互操作性之间的区别,以下列出了部分内容: 无法映射特定

6.set ff=unix;设置Linux中文件中每行后又尖括号的情况

 用vi命令打开要替换尖括号的文件 直接输入:   :set ff=unix 表示设置文件格式是unix格式

【技术贴】c语言头文件加引号是什么意思?include中有些是尖括号,有些是双引号?

答:使用系统里提供的头文件时使用尖括号<stdio.h>使用自己编写的头文件时使用双引号"stdio1.h" 因为如果头文件中的内容是你自己编写的,一般用"",表示在当前目录查找相应内容,如果找不到,就到系统指定的目录中去找,如果你用尖括号的话,那么只能去系统指定的目录去查找了,而不会到当前目录查找,一般用""会比较安全,不用关心去哪查找.