Как проверить серийный номер по такой маске?

надо проверять серийные номера по маске такого вида (XXAAAAAXAA, NXXAAXZXXX).

Где

N – цифра от 0 до 9,

A – прописная буква латинского алфавита,

a – строчная буква латинского алфавита,

X – прописная буква латинского алфавита либо цифра от 0 до 9,

Z –символ из списка: “-“, “_”, “@”.

Как проверить значение по таким маскам?


Ответы (2 шт):

Автор решения: MyZik

XXAAAAAXAA:

Regex: /^[A-Z0-9]{2}[A-Z]{5}[A-Z0-9]{1}[A-Z]{2}$/gu

Тест на regex101


NXXAAXZXXX:

Regex: /^\d{1}[A-Z0-9]{2}[A-Z]{2}[A-Z0-9]{1}[\-_\@][A-Z0-9]{3}$/gu

Тест на regex101

→ Ссылка
Автор решения: Lexa Berezin
function checkSerialMask($serial, $mask) {
if (strlen($serial) != strlen($mask)) 
    return false;

$regx = array(
    "N" => "[0-9]",
    "A" => "[A-Z]",
    "a" => "[a-z]",
    "X" => "[A-Z0-9]",
    "Z" => "[-|_|@]"
);

//make chars array from mask
$maskChars = str_split($mask);

//generating target regex
$outputRegex = "/^";
foreach ($maskChars as $char) {
    $outputRegex .= $regx[$char];
}
$outputRegex .= "/";

return (preg_match($outputRegex, $serial) > 0 ? true: false);
→ Ссылка