#javascript #node.js #regex #ecmascript-6 #proxies
#javascript #node.js #регулярное выражение #ecmascript-6 #прокси
Вопрос:
Я создаю прокси-скребок с открытым исходным кодом, который запрашивает URL-адрес, получает тело, проверяет, прокси ли это и т.д…
Как всегда, это работает только с НЕОБРАБОТАННЫМ текстом. И я хочу отфильтровать ВСЕ прокси из полученного HTML.
filterProxies(text) {
if (typeof (text) == 'string') {
let regx = /^(d{1,3}.d{1,3}.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.');
}
}
это регулярное выражение проверяет, является ли строка прокси, но не работает, когда я пытаюсь отфильтровать прокси.
Комментарии:
1. Не могли бы вы, пожалуйста, предоставить пример ввода и ожидаемый результат с использованием регулярного выражения
2. от
html <a>127.0.0.1:4000</a><div>127.0.0.1:4100</div>
доjs > ['127.0.0.1:4000', '127.0.0.1:4100']
3.
var str = "<a>127.0.0.1:4000</a><div>127.0.0.1:4000</div>"; var out = str.match(/d{1,3}.d{1,3}.d{1,3}.d{1,3}:d{1,4}/g); console.log(out);
. — У вас это работает?4. Это не «прокси», а просто IPv4-адреса с номером порта, хотя вы никогда не называете это так. Порты могут варьироваться от 1 до 65535 (да, даже 1 или 5 цифр). Как насчет адресов IPv6? Как насчет недопустимых адресов (555.318.998.001)? Почему ваше собственное регулярное выражение допускает пробелы (т.Е.
0.0.0.0 :00
было бы найдено)?5. Я знаю, я просто хочу иметь возможность извлекать из HTML все, что выглядит как IP
Ответ №1:
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,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, null, ' '));
Вывод на консоль:
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:4000",
"127.0.0.1:4100"
]
Объяснение:
- входная строка содержит 6 адресов, 3 с допустимым диапазоном, 3 с недопустимым диапазоном
- regex1 выполняет простое определение адреса ipv4, без проверки диапазона, с дополнительным номером порта
- regex2 определяет ipv4-адрес с правильной проверкой диапазона байтов 0 … 255 с дополнительным номером порта
- regex2 не проверяет диапазон номера порта, это может быть сделано таким же образом, как проверка байта
- подробнее о регулярном выражении 2:
(?<!d)
— начните с отрицательного взгляда назад, чтобы исключить цифру([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])
— Шаблоны OR’ed 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