<?php

error_reporting(-1);

/**
 * (\+7|\s+\+7|\+\s7|\s+\+\s7|8|\s+8) - Начало номера
 * ((-|\s\(|\(|\s\(\s|)?) - После начала номера может быть промежуток
 * ([0-9]{3}|[0-9]{4}) - После идет код города (3 и 4 цифры)
 * ((-|\)\s|\s|\)\s-\s|\s\)\s)?) - Еще один промежуток
 * ([0-9]{1}|[0-9]{2}|[0-9]{3}|[0-9]{7}) - Цифры
 */

$regexp = '!^(\+7|\s+\+7|\+\s7|\s+\+\s7|8|\s+8)((-|\s\(|\(|\s\(\s|)?)([0-9]{3}|[0-9]{4})([0-9]{1}|[0-9]{2}|[0-9]{3}|[0-9]{7})!';

$correctNumber = array(
    '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',
    ' + 7 999 123 4567',
    ' +7 999 123 4567',
    '8 ( 999 ) 1234567',
    '8(999)1234567',
    '8 999 123 4567',
 );
$wrongNumber = array(
    '02',
    '9+',
    '  ',
    'abcdefg',
    '84951234567 позвать люсю',
    '849512345',
    '849512345678',
    '8 (409) 123-123-123',
    '7900123467',
    '5005005001',
    '8888-8888-88',
    '84951a234567',
    '8495123456a',
    '+1 234 5678901',
    '+8 234 5678901',
    '7 234 5678901',
);

echo "Верные номера.\n\n";

for ($i = 0; $i < count($correctNumber); $i++) {
    if (preg_match($regexp, $correctNumber[$i])) {
        echo "[+] Номер \"{$correctNumber[$i]}\" записан верно.\n";
    } else {
        echo "[-] Номер \"{$correctNumber[$i]}\" записан не верно.\n";
    }
}

echo "\nНеверные номера.\n\n";

for ($i = 0; $i < count($wrongNumber); $i++) {
    if (preg_match($regexp, $wrongNumber[$i])) {
        echo "[+] Номер \"{$wrongNumber[$i]}\" записан верно.\n";
    } else {
        echo "[-] Номер \"{$wrongNumber[$i]}\" записан не верно.\n";
    }
}