fork download
  1. <?php
  2.  
  3. // Требуется написать регулярку, которая будет пропускать через
  4. // себя телефонные номера в формате 88005553535, в т.ч. с пробелами
  5. // и тире, скобочками и без них.
  6.  
  7. // Сначала делаем список номеров, который будем гонять через регулярку.
  8. const PHONES = array(
  9. "88005553535", // Ok;
  10. "8(801)555(35)35", // Ok;
  11. "8-802-555-35-35", // Ok;
  12. "8(803)(555)(35)(35)", // Ok;
  13. "8-(804)-(555)-(35)-(35)", // Ok;
  14. "8 805 555 35 35", // Ok;
  15. "---(8)---(8)(0)(6)---(5)(5)(5)---(3)(5)---(3)(5)---", // Как бы странно не казалось, но ок.
  16. "8807", // Неверно, т.к. длина номера < 10 цифр;
  17. "88085553535555", // Неверно, т.к. длина номера > 10 цифр;
  18. "8809555aaaa", // Неверно, т.к. присутстует латиница;
  19. "FooBar"// Также неверно.
  20. ); // Итого 11 номеров, из которых 7 верных.
  21.  
  22.  
  23. $regexp = "/[-()\\s]*([0-9][-()\\s]*){11}/";
  24. // Сначала возможно встретится один из символов [-()] или пробел, сколько угодно раз,
  25. // затем обязательно одиннацать блоков, состоящие из одной цифры [0-9],
  26. // и возможно еще из символов [-()] (и пробела), сколько угодно раз.
  27. // Вообще т.к. нам не нужны тут буквы, то и регистр, и кодировка оных
  28. // нам не важна, и флаги 'ui' не нужны.
  29. // P.s. Для России упростить на '8' или '+7' в начале, и десять блоков.
  30.  
  31. $rightPhones = []; // Создаем пустой массив для правильных номеров;
  32. $wrongPhones = []; // И для неправильных;
  33.  
  34. foreach(PHONES as $phone){
  35. $match = []; // Создаем пустой массив для записи туда номера через preg_match;
  36. if (preg_match($regexp, $phone, $match)){ // Если номер пройдет через регулярку, то будет записан в $match[0];
  37. $rightPhones[] = $match[0]; // И добавлен в массив с правильными номерами;
  38. }
  39. else
  40. $wrongPhones[] = $phone; // Иначе же добавляем номер в массив с неправильными;
  41. }
  42.  
  43. echo "Правильные номера: \n"; // Выводим список правильных номеров;
  44. foreach($rightPhones as $phone){ // Используя для этого поэлементный проход массива через foreach();
  45. echo "$phone \n";
  46. }
  47.  
  48. echo "Неправильные номера: \n"; // И так же для неправильных;
  49. foreach($wrongPhones as $phone){
  50. echo "$phone \n";
  51. }
  52.  
  53. // TODO:
  54. // 1. Реализовать вывод данных массива не поэлементным проходом,
  55. // а каким-нибудь var_dump(), чтобы не плодить лишних переменных.
  56. // Ну и изучить форматированный вывод данных.
  57. // 2. Реализовать перевод данных из массива в удобочитаемый вид
  58. // "88005553535" - т.е. нужно будет убрать весь мусор из строки.
Success #stdin #stdout 0.01s 82944KB
stdin
Standard input is empty
stdout
Правильные номера: 
88005553535 
8(801)555(35)35 
8-802-555-35-35 
8(803)(555)(35)(35) 
8-(804)-(555)-(35)-(35) 
8 805 555 35 35 
---(8)---(8)(0)(6)---(5)(5)(5)---(3)(5)---(3)(5)--- 
88085553535 
Неправильные номера: 
8807 
8809555aaaa 
FooBar