Мое решение состоит в том, чтобы использовать три отдельных регулярных выражения с использованием логических OR
операторов:
if (
preg_match('/^\d{5}(?:\-\d{4})?$/i', $code, $matches) OR
preg_match('/^[a-z]\d[a-z] ?\d[a-z]\d$/i', $code, $matches) OR
preg_match('/^[a-z]{1,2}\d{1,2} ?\d[a-z]{2}$/i', $code, $matches)
) {
// deal with $matches here
}
Обратите внимание, что это работает, потому что PHP использует логику короткого замыкания.После того, как один тест пройден, остальные игнорируются, поэтому $matches
не будет переопределено.