从HTML过滤代理

问题描述

我正在制作一个开放源代码的代理刮板,该刮板请求一个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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...