Помогите с регуляркой для поиска телефонов



  • Помогите с регуляркой для поиска телефонов в исходном коде.

    Номера начинаются с +7 или 8
    имеют 10 цифр после кода страны
    +79999379992
    89999379992
    999-93-79-992
    999-937-99-92
    999-93-799-92
    (999)93-799-92
    (999)93-79-992
    (999)937-99-92
    и те же комбинации с кодом страны

    ^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$
    

    Нашел на просторах такую регулярку, но в БАС почему то не работает



  • конструктором регулярок пользовался?



  • как минимум вариант чтобы проще было.. регуляркой вырезаешь часть кода с номером, а потом просто это выражение применить к строке \d+



  • @smurfik нужна универсальная регулярка под любой код страницы



  • @DrPrime ну парсить ты будешь с одного сайта, значит там будет одинаковый код... а вообще проще было бы если скинешь ссылку на страницу... но то что я выше написал можно применить в любом случае



  • @DrPrime в любом случае в любом коде на любой странице будет примерно так код код код бла бла бла номер бла бла бла код код код... вот регуляркой вырезаешь бла бла бла номер бла бла бла.. а потом парсишь все цифры



  • @smurfik Парсинг будет на разных сайтах. Код вокруг номера разный



  • @DrPrime ну тогда сделай в меню выбор сайта - переключатель. и к каждому коду свой вариант событий



  • @DrPrime это будет проще, чем сделать универсальную регулярку





  • ((8|+7)-?)?(?\d{3,5})?-?\d{1}-?\d{1}-?\d{1}-?\d{1}-?\d{1}((-?\d{1})?-?\d{1})? эта впринцыпе должна работать



  • @seedgg Спасибо, находил уже этот сайт, но почему то ни одна не работает в бас. Несколько возвращают только первую цифру, буду копаться дальше почему так



  • @DrPrime они и будут возвращать только одну цифру... потому что это очень геморная задача... сделай моим методом, и все будет хорошо. я не думаю что у тебя там список из 100 сайтов для парсинга



  • @smurfik из 3 х млн



  • @DrPrime said in Помогите с регуляркой для поиска телефонов:

    @seedgg Спасибо, находил уже этот сайт, но почему то ни одна не работает в бас. Несколько возвращают только первую цифру, буду копаться дальше почему так

    потому что там регулярки .NET формата, а нужны javascript.



  • @DrPrime тогда опиши что и для чего ты делаешь, потому что понять теперь точно невозможно.



  • @out Можешь помочь с переделкой из под js?



  • @DrPrime я бы сделал так, это проще и надежнее, чем городить regexp под все варианты.
    в логе смотри [23:12:26] Поток №1 : Номеров найдено: 8
    [23:12:26] Поток №1 : ["79999379992","89999379992","9999379992","9999379992","9999379992","9999379992","9999379992","9999379992"]

    сделал такой говнокод, но рабочий

    var potential_phones = VAR_SAVED_CONTENT.match(/\+?(7|8)?[\d\-\(\)\ ]+/g);
    var valid_phones = [];
    
    if (potential_phones != null) {
      var tmpV;
      potential_phones.forEach(function(item, i, arr) {
        tmpV = potential_phones[i].match(/\d+/g);
        if (tmpV != null) {
          tmpV = tmpV.join("");
          if (tmpV.length > 9 && tmpV.length < 12) valid_phones.push(tmpV);
        }
      });  
    }
    
    if (valid_phones.length) {
      log("Номеров найдено: " + valid_phones.length);
      log(JSON.stringify(valid_phones));
    } else {
      log("Номера не найдены.");
    }
    

    0_1489958738664_dfjytjtj.xml

    сперва парсим все совпадения регуляркой \+?(7|8)?[\d\-\(\)\ ]+
    проходимся по всем совпадениям, берем одни только цифры, проверяем к-во цифр, если их от 10 до 11, то это моб телефон.

    так на вскидку, минус тут в том, что если в коде страницы будет просто "5555555555" то это тоже примется , как моб тел.
    Но этот момент можно убрать, если в регулярку начальную прописать все мобильные операторы РУ, а лучше не в регулярку, а просто в массив, а дальше обработанные результаты парсинга уже сверить , начинается ли номер с кода моб оператора, тогда будет очень мало не валидных номеров.

    плюс метода в том, что он спарсит номера во многих форматах, а дальше уже приведет в чистый цифровой формат.

    но метод таки придуман сходу и на коленке, на твоем исходном примере, так что нужно проверять на реальных данных и смотреть чего не хватает..



  • @out Спасибо
    Сделал похожим образом, чуть регулярку другую сделал.

    ((8|\+7)[- ]?[(]?\d{3}[)]?[- ]?[ ]?\d{1,3}[- ]?\d{1,3}[- ]?\d{1,3})
    

    А потом проверка всех по длине.
    Буде еще тестировать и твой вариант.



  • @DrPrime ок, только в моем коде измени на if (valid_phones.length) это я забыл. Пост отредактировал.


Log in to reply