<?php
/* Дан текст, который по идее должен быть номером телефона в виде 8-(911)-506 56 56
(т.е. человек может ввести не только цифры, но и скобки, минусы, может что-то еще).
Но в реальности, пользователь может вместо номера написать что угодно.
Напиши скрипт для проверки правильности введенного номера («8(911)-506 56 56» —
правильный номер, «8-911-50-656-56» — правильный, «89115065656» — правильный,
«02» — неправильный, «89115065656 позвать Люду» — неправильный).*/

// Правильные: 
$correctNumbers = [ 
  '84951234567', 
  '+74951234567',
  '8-495-1-234-567', 
  ' 8 (8122) 56-56-56',
  '8-911-1234567',
  '8 (911) 12 345 67', 
  '8-911 12 345 67',
  '8 (911) - 123 - 45 - 67',
  '+ 7 999 123 4567', 
  '8 ( 999 ) 1234567',
  '8 999 123 4567'
];

// Неправильные: 
$incorrectNumbers = [
  '02',
  '84951234567 позвать люсю',
  '849512345',
  '849512345678', 
  '8 (409) 123-123-123',
  '7900123467',
  '5005005001',
  '8888-8888-88',
  '84951a234567',
  '8495123456a', 
  '+1 234 5678901', /* неверный код страны */
  '+8 234 5678901', /* либо 8 либо +7 */
  '7 234 5678901', /* нет + */
  
  '7 234((((( 5678901', /* не допускаются подряд идущие пробелы, скобки, дефисы */
  '8 (911( 12 345 67', /* несоответствие скобок */
  '8 (911 12 345 67', /* если есть открывающая скобка, то нужна закрывающая */
  '8 (911 12 345 67)', /* закрывающая скобка "не там" */
];


// $regExp = '/^(\+\s?7|8)([\s\(\)-]*\d){10}$/';
// $regExp = '/^(\+\s?7|8)\s?-?\s?\(?(\s?\d){3}\s?\)?(\s?-?\s?\d){7}$/';
// $regExp = '/^(\+\s?7|8)\s?-?\s?\(?((\s?\d){3}|(\s?\d){4})\s?\)?(?(3)(\s?-?\s?\d){7}|(\s?-?\s?\d){6})$/';
$regExp = '/^(\+\s?7|8)\s?-?\s?(\()?((\s?\d){3}|(\s?\d){4})\s?(?(2)\))(?(4)(\s?-?\s?\d){7}|(\s?-?\s?\d){6})$/';

foreach(array_merge($correctNumbers, $incorrectNumbers) as $number) {
	$number = trim($number);
	if (preg_match($regExp, $number)) {
		echo "Номер \"{$number}\" правильный.\n";
	} else {
		echo "Номер \"{$number}\" ошибочный.\n";
	}
}