<?php
$numbers = 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',
    '8 ( 999 ) 1234567',
    '8 999 123 4567'
);

$regular = '/^((\s)*8|\+(\s)*7)(( |-|\(|\)|_|)*[0-9]( |-|\(|\)|_|)*){9}[0-9]$/';
$matches = preg_grep($regular, $numbers);

$regular = '/\+7/';
$matches = preg_replace($regular, "8", $matches);

$regular = '/\D/';
$matches = preg_replace($regular, "", $matches);
print_r($matches);
?>

Тут то же самое, надо бы проверить на большом списке номеров.
> $regular='/-|_|\)|\(| | /';
Проще написать «заменить все не-цифры» чем перечислять возможные символы.
Там даже есть конструкция \\D для этого.