问题描述
我正在制作一个开放源代码的代理刮板,该刮板请求一个URL,获取正文,检查是否是代理等...
但是,这仅适用于RAW文本。而且我想从收到的HTML中过滤所有代理。
filterProxies(text) {
if (typeof (text) == 'string') {
let regx = /^(\d{1,3}\.\d{1,3})(?:\s+|\s*:\s*)(\d{2,5})$/img;
return [...text.matchAll(regx)]
} else {
throw new Error('\'.filterProxies(text)\': "text" is not an String.');
}
}
此正则表达式可用于检查字符串是否是代理,但在我尝试过滤代理时不起作用。
解决方法
let str = '<a>127.0.0.1</a> '
+ '<b>127.0.0.1:4000</b> '
+ '<div>127.0.0.1:4100</div> '
+ '<err1>001.2.3.4</err1> '
+ '<err2>1.2.3.4444</err2> '
+ '<err3>1.2.3.256</err3>';
let regex1 = /\d{1,3}\.\d{1,3}(:\d{1,5})?/g;
let result1 = str.match(regex1);
console.log('result1: '+ JSON.stringify(result1,null,' '));
let regex2 = /(?<!\d)([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}(:\d{1,5})?(?!\d)/g;
let result2 = str.match(regex2);
console.log('result2: '+ JSON.stringify(result2,' '));
控制台输出:
result1: [
"127.0.0.1","127.0.0.1:4000","127.0.0.1:4100","001.2.3.4","1.2.3.444","1.2.3.256"
]
result2: [
"127.0.0.1","127.0.0.1:4100"
]
说明:
- 输入字符串有6个地址,其中3个有效范围,3个无效范围
- regex1使用可选的端口号进行简单的ipv4地址检测,而无需范围检查
- regex2使用适当的字节范围检查0 ... 255(带有可选的端口号)进行ipv4地址检测
- regex2不会检查端口号的范围,可以像检查字节一样来完成
- 有关regex2的详细信息:
-
(?<!\d)
-从负向后查找开始以排除数字 -
([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])
-或为0-9、10-99、100-199、200-249、250-255的格式 -
(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}
-后跟3个点和与以前相同的OR'ed模式实例 -
(:\d{1,5})?
-后接可选端口号 -
(?!\d)
-提前否定以确保没有数字
可以将正则表达式增强为支持ipv6