Ось мій варіант кому цікаво, але крім буквених масок ще можливі номер з датою (рік від 1950 до 2050), зеркало та послідовності однакових цифр:
function pattern_match($number, $pattern) {
if (!isset($pattern) || empty($pattern)) return true;
$number = preg_replace("/[^0-9]/","",$number);
$pattern_len = strlen($pattern);
$number_len = strlen($number);
if ($number_len == 10) {
$number = substr($number, 3);
$number_len = strlen($number);
}
if ($pattern == 'номер з датою') {
$start_date = 1910;
$end_date = 2050;
$date = $start_date;
while ($date < $end_date) {
if (strpos($number, (string) $date) == 3)
return true;
$date++;
}
}
if ($pattern == 'зеркало') {
$number_z[] = $number;
$number_z[] = substr($number, 1, 6);
$number_z[] = substr($number, 2, 5);
$number_z[] = substr($number, 3, 4);
foreach($number_z as $z) {
$i = 0;
$j = strlen($z) - 1;
while($z[$i] == $z[$j]) {
if ($i > $j) {
return true;
}
$i++;
$j--;
}
}
return false;
}
if ($pattern == 'дві цифри' || $pattern == '2 цифри') {
return (strlen(count_chars($number, 3)) === 2);
}
if ($pattern == 'три цифри' || $pattern == '3 цифри') {
return (strlen(count_chars($number, 3)) === 3);
}
if ($pattern == 'чотири цифри' || $pattern == '4 цифри' || $pattern == 'чотири цифри') {
return (strlen(count_chars($number, 3)) === 4);
}
if ($pattern == "п'ять цифр" || $pattern == '5 цифр') {
return (strlen(count_chars($number, 3)) === 4);
}
if ($pattern == 'шість цифр' || $pattern == '6 цифр') {
return (strlen(count_chars($number, 3)) === 4);
}
if ($pattern == 'сім цифр' || $pattern == '7 цифр') {
return (strlen(count_chars($number, 3)) === 7);
}
$number_pattern = preg_replace("/[^0-9]/","",$pattern);
if (strlen($number_pattern) == 0) {
$pattern = preg_replace("/[^a-zA-Z]/","",$pattern);
} else {
if (strpos($number, $number_pattern) === false) {
return false;
} else {
return true;
}
}
$size = $number_len - $pattern_len + 1;
if ($size < 1) {
return false;
}
$ngram = array();
for ($i = 0; $i < $size; $i++) {
$ngram = substr($number, $i, $pattern_len);
$arr = array();
$flag = true;
for ($j = 0; $j < $pattern_len; $j++) {
if (array_key_exists($pattern[$j], $arr)) {
if ($arr[$pattern[$j]] != $ngram[$j]) {
$flag = false;
break;
}
} else {
$arr[$pattern[$j]] = $ngram[$j];
}
}
if ($flag) {
return true;
}
}
return false;
}