#алгоритм #регулярные_выражения #миграция
Есть поле в базе, которое содержит номера телефонов и имеет произвольный формат. т.е. каких то валидаторов на нём не было. Надо из этого поля 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")); Песочница
Комментариев нет:
Отправить комментарий