Фильтровать прокси из HTML

#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