用nodejs做采集网站时,需要把内容保存在本地txt中。由于网页中包含一些转义的字符需要解析成实体,而nodejs官方库并没有这个功能的支持。我也不想用第三方库,索性自己写了一个简易版的解析方法。
html转义字符有三种形式,以下用正则描述:
- 特殊含义的标记,格式为 "&[a-z]+;",例如 ,表示空格
- 10进制表示的转义字,格式为 "&#\d+;",例如A,表示"A"
- 16进制表示的转义字,格式为 "&#x\d+;",例如A,表示"A"
所以解析的方法需要对以上三种情况进行替换,其他的按照原文返回。最后实现代码如下:
'use strict';
// 特殊标记和数字对照表
let sp={
'amp':38,
'lt':60,
'gt':62,
'quot':34,
'nbsp':160,
'cent':162,
'pound':163,
'curren':164,
'copy':169,
'reg':174,
'hellip':8230
};
// 匹配字符
let p=/\&(\#*)(x*)([a-z\d]+)\;*/ig;
// 输入参数为可包含转义字符的字符串,返回解析之后的结果
module.exports=(s)=>{
return s.replace(p,(a)=>(()=>a.toLowerCase().replace(
p,(...a)=>!a[1]?String.fromCharCode(sp[a[3]])||a[0]:
String.fromCharCode(parseInt(a[3],a[2]?16:10))))());
};
// 调用示例
console.log(module.exports(' Ab dA '));
代码很简单,唯一需要注意的是不加分号结尾的转义符号,所有浏览器都是识别的,有些网站开发会偷懒这样写,因此匹配时不要忘了这种特殊的情况。
相关文档
暂无
随便看看
畅言模块加载中