# escape
# Description
转义 string 中的 &
, <
, >
, "
,'
, 和`
字符为 HTML 实体字符。
# Params
string
# Return
string
# Code
/** Used to map characters to HTML entities. */
const htmlEscapes = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
}
/** Used to match HTML entities and HTML characters. */
const reUnescapedHtml = /[&<>"']/g
const reHasUnescapedHtml = RegExp(reUnescapedHtml.source)
function escape(string) {
return (string && reHasUnescapedHtml.test(string))
? string.replace(reUnescapedHtml, (chr) => htmlEscapes[chr])
: (string || '')
}
# Analyze
判断了 string
存在 并且也确实含有上述字符,然后就通过 string.replace
方法进行替换,将对应的字符替换为 htmlEscapes
定义的转义之后的字符
这里 定义两个正则,是因为 匹配完了之后会改变 lastIndex
属性
# Remark
- RegExp.lastIndex (opens new window)
只有正则表达式使用了表示全局检索的 "g" 标志时,该属性才会起作用。此时应用下面的规则:
- 如果 lastIndex 大于字符串的长度,则 regexp.test 和 regexp.exec 将会匹配失败,然后 lastIndex 被设置为 0。
- 如果 lastIndex 等于字符串的长度,且该正则表达式匹配空字符串,则该正则表达式匹配从 lastIndex 开始的字符串。(then the regular expression matches input starting at lastIndex.)
- 如果 lastIndex 等于字符串的长度,且该正则表达式不匹配空字符串 ,则该正则表达式不匹配字符串,lastIndex 被设置为 0.。
- 否则,lastIndex 被设置为紧随最近一次成功匹配的下一个位置。
- String.prototype.replace() MDN (opens new window) 方法返回一个由替换值(replacement)替换部分或所有的模式(pattern)匹配项后的新字符串。模式可以是一个字符串或者一个正则表达式,替换值可以是一个字符串或者一个每次匹配都要调用的回调函数。如果 pattern 是字符串,则仅替换第一个匹配项。
# Example
console.log(escape(' <p>1</p>')) // &nbsp; <p>1</p>
← eq escapeRegExp →