html转义反转义

html-css051

html转义反转义,第1张

// 字符串反转义

function enXssHtml(text) {

const matchList = {

"<": "<",

">": ">",

"&": "&",

"": '""',

""": '"',

"'": "'",

}

let regStr = "(" + Object.keys(matchList).toString() + ")"

// ↑ ------------【 提取匹配列表key值 】.【组数转字符串】

regStr = regStr.replace(/,/g, ")|(")

// ↑ 通过匹配将其更新为正则的字符串类型

const regExp = new RegExp(regStr, "g")

// ↑ ------- 字符串 转 正则 方法

return text.replace(regExp, (match) =>matchList[match])

// ↑ ------ 替换方法 (正则, 当前key =>返回当前被匹配的key值)

}

// 字符串反转义

function deXssHtml(text) {

const matchList = {

"<": "<",

">": ">",

"&": "&",

'"': '"',

'"': '"',

"'": "'",

}

let regStr = "(" + Object.keys(matchList).toString() + ")"

// ↑ ------------【 提取匹配列表key值 】.【组数转字符串】

regStr = regStr.replace(/,/g, ")|(")

// ↑ 通过匹配将其更新为正则的字符串类型

const regExp = new RegExp(regStr, "g")

// ↑ ------- 字符串 转 正则 方法

return text.replace(regExp, (match) =>matchList[match])

// ↑ ------ 替换方法 (正则, 当前key =>返回当前被匹配的key值)

}

经本人测试,据我的理解,问题的原因应该不是脚本的问题,你用firebug进行观察会发现,当你传送post的时候,其中的html文本域内容已经进行了编码,但这个编码会在你脚本运行之前进行还原,所以,不会影响你的正则脚本运算。

据我的估计,原因在于:你在输入正则表达式的时候,可能不是太正确。以下是我的测试过程:

运行访问你的脚本,在文本域里将你的脚本源代码粘上,再在正则表达输入框里输入:

%<input

type(.*)/>%si

你查看网页源代码,其输出结果如下:

<pre>Array

(

[0]

=>

Array

(

[0]

=>

<input

type="submit"

name="button"

value="提交"

/>

)

[1]

=>

Array

(

[0]

=>

="submit"

name="button"

value="提交"

)

)

</pre>

说明,还是匹配到了html标签。

而第1个匹配项,在浏览器里会显示为一个html按钮,原因在于这是正规的html语句,所以,浏览器会将这个表现出来。

通过Javascript模拟显示即可:

function html2Escape(sHtml) { return sHtml.replace(/[<>&"]/g,function(c){return {'<':'&lt','>':'&gt','&':'&amp','"':'&quot'}[c]})}    

//转义符换成普通字符

function escape2Html(str) { var arrEntities={'lt':'<','gt':'>','nbsp':' ','amp':'&','quot':'"'} return str.replace(/&(lt|gt|nbsp|amp|quot)/ig,function(all,t){return arrEntities[t]})}    

// &nbsp转成空格

function nbsp2Space(str) { var arrEntities = {'nbsp' : ' '} return str.replace(/&(nbsp)/ig, function(all, t){return arrEntities[t]})}