html字符实体
在HTML中,有些些字符是预留的,有特殊意义的,所以这些字符是不允许在文本中使用的。比如小于号(<)和大于号(>)。如果希望正确地显示预留字符,我们必须HTML 源代码中使用字符实体(character entities)。
要转换html实体的原因主要是在html页面中有一些字符实体如果不转换的话会对本身的html页面产生影响,这里面主要就有<
,>
,"
,'
,空格等。
下面是一些常见的HTML字符实体
显示结果 | 描述 | 实体名称 | 实体编号 |
---|---|---|---|
空格 | |
  |
|
< | 小于号 | < |
< |
| 大于号 |
>
|>
& | 和号 |&
|&
“ | 双引号 |"
|"
‘ | 单引号 |'
|'
′ | 重音符 |´
|`
© | 版权 |©
|©
® | 注册商标 |®
|®
™ | 商标 |™
|™
在实际的工作中经常会遇到要处理HTML字符实体的情况,这里我总结了一些处理方法。
php
1. htmlspecialchars()
htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。
预定义的字符包括:&
,"
,'
,<
,>
参数 | 必需性 | 描述 |
---|---|---|
string | 必需 | 规定要转换的字符串 |
quotestyle | 可选 | 规定如何编码单引号和双引号 ENT_COMPAT - 默认。仅编码双引号。 ENT_QUOTES - 编码双引号和单引号。 ENT_NOQUOTES - 不编码任何引号。 |
character-set | 可选 | 字符串值,规定要使用的字符集。 |
double_encode | 可选 | 布尔值。规定了是否编码已存在的 HTML 实体。 |
提示和注释
提示:在 PHP5.4 之前的版本,无法被识别的字符集将被忽略并由 ISO-8859-1 替代。自 PHP5.4 起,无法被识别的字符集将被忽略并由 UTF-8 替代。 character-set 自5.6版本开始默认使用的字符集可以在设置项中改变。对应的解码函数htmlspecialchars_decode()。
2. htmlentities()
这个函数的参数是和htmlspecialchars()完全相同的,它们的区别就在于htmlspecialchars()只会转换特定的字符,就是上面所说的预定义的字符;而htmlentities()会转换所有的html字符实体;对应的解码函数html_entity_decode()。
javascript
1. 利用正则匹配转换
function html_encode(str)
{
var s = ""
;
if (str.length == 0) return ""
;
s = str.replace(/&
/g,">"
);
s = s.replace(/<
/g,"<"
);
s = s.replace(/>
/g,">"
);
s = s.replace(/ /g," "
);
s = s.replace(/\'
/g,"'"
);
s = s.replace(/\"
/g,"""
);
s = s.replace(/\n
/g,"<br>"
);
return s;
}
function html_decode(str)
{
var s = ""
;
if (str.length==0) return ""
;
s = str.replace(/>
/g,"&"
);
s = s.replace(/<
/g,"<"
);
s = s.replace(/>
/g,">"
);
s = s.replace(/
/g,"
"
);
s = s.replace(/'
/g,"\'"
);
s = s.replace(/"
/g,"\""
);
s = s.replace(/<br>
/g,"\n"
);
return s;
}
2. 用的浏览器内部转换器实现转换,方法是动态创建一个容器标签元素,如DIV,将要转换的字符串设置为这个元素的innerText,然后返回这个元素的innerHTML,即得到经过HTML编码转换的字符串。
function html_encode(html)
{
return document.createElement('div'
)
.appendChild(document.createTextNode(html))
.parentNode.innerHTML;
}
function html_decode(html)
{
var a = document.createElement('div'
);
a.innerHTML = html;
return a.textContent;
}
这种方法有一个问题就是对于单引号'
和双引号"
不会进行转义处理,对于这种方法使用的时候就要非常注意了。
比如转义,用第一种方法:
<a href="http://owlsn.github.io/blog"></a>
第二种方法:
<a href="http://owlsn.github.io/blog"></a>
虽然第二种方法看起来简洁,但是在一些特殊情况下是会出现问题的,总之我还是比较倾向于使用第一种用正则匹配的方法,根据实际情况可以自己控制需要转换的实体。