Страницы

Поиск по вопросам

среда, 22 января 2020 г.

Извлечение телефонных номеров из поля произвольного формата

#алгоритм #регулярные_выражения #миграция


Есть поле в базе, которое содержит номера телефонов и имеет произвольный формат.
т.е. каких то валидаторов на нём не было.
Надо из этого поля phoneInfo достать регулярным выражением два номера телефонов,
учитывая: 


все номера только 9-и значные и могут содержать в начале 2 или 9, т.е
923456789 или 223456789
могут содержать различные разделители без особых правил (пробелы, /, -), например:
91 / 123-45 67 
могут содержать код страны +123 или (123), его не учитывать, т.е. (123) 912345678,
действительный номер 912345678      
оба номера могут разделяются с: пробел(ы), /, -, причём этот символ являются разделителем
только если с правой стороны находится действительный номер как описано выше, например:
243 / 91-23 45 678, действителен второй номер 912345678         


Стоит ешё задача, к каждому "не попаданию" выдать причину, поэтому одним выражением
наверное не получится.   

ЯП не важен, диалект тоже в принципе нет (может perl). Поэтому готовый код я не ожидаю,
если кто-то предложит, пойму любой. А так псевдокода или даже просто совета хватит.   

Пример результата: "243 / 91-23 45 678" result: "", "less as 9 digit",  "912345678",
"ok"  

Пробую так (псевдокод):

// убираю всё лишнее
phoneNorm = replace (phoneInfo, "([(+]\d{3}\)?|\s+)", "")
phoneNorm = replace (phoneNorm, "(\d{1,8})[ /-](\d{1,8})", "\1\2")
// вытягиваю оба номера
phoneNo1 = substr (phoneNorm, "\d{9}", 1)
phoneNo2 = substr (phoneNorm, "\d{9}", 2)  


Можно ли как-то поизяшней? И как организовать информацию по несовпадениям?
    


Ответы

Ответ 1



Вариант на php: 0) { if (!ctype_digit($str[$i-- - 1])) { continue; } if (++$foundDigits == 9) { break; } } return $i; } function sanitizied($str) { return preg_replace("/\D/", "", $str); } function validateResponse($phone) { if (strlen($phone) != 9) { return "less as 9 digit"; } if ($phone[0] != '2' && $phone[0] != '9') { return "invalid number"; } return "ok"; } function validate($str) { $pos = numposOfPhonesDelim($str); if ($pos) { $phone1 = sanitizied(substr($str, 0, $pos)); $phone2 = sanitizied(substr($str, $pos)); } else { $phone1 = sanitizied($str); $phone2 = ""; } return [ 'input' => $str, 'result' => [ [ 'number1' => $phone1, 'resp' => validateResponse($phone1) ], [ 'number2' => $phone2, 'resp' => validateResponse($phone2) ] ] ]; } // ================================= var_dump(validate("243 / 91-23 45 678")); var_dump(validate("243 / 1-23 45 678")); var_dump(validate("243")); var_dump(validate("+21 / 23 45 678 / 91-23 45 678")); var_dump(validate("+71 / 23 45 678 / 91-23 45 678")); Песочница

Комментариев нет:

Отправить комментарий