isIsbn($compact)) { return self::ISBN; } if (preg_match('/^[0-9]{13}$/', $compact) === 1) { return self::EAN; } if (preg_match('/^[0-9]{12}$/', $compact) === 1) { return self::UPC; } if (preg_match('/^[A-Z0-9]{10}$/', $compact) === 1 && preg_match('/[A-Z]/', $compact) === 1) { return self::ASIN; } if ($this->looksLikeBarcode($compact)) { return self::BARCODE; } if ($this->isMpn($compact)) { return self::MPN; } if ($this->looksLikeTitle($input)) { return self::TITLE; } return self::UNKNOWN; } private function isIsbn(string $compact): bool { if (preg_match('/^[0-9]{9}[0-9X]$/', $compact) === 1) { return true; } return preg_match('/^97[89][0-9]{10}$/', $compact) === 1; } private function looksLikeBarcode(string $compact): bool { return preg_match('/^[0-9]{8,14}$/', $compact) === 1; } private function isMpn(string $compact): bool { if (preg_match('/^[A-Z0-9][A-Z0-9\-\.]{4,39}$/', $compact) !== 1) { return false; } return preg_match('/[A-Z]/', $compact) === 1 && preg_match('/[0-9]/', $compact) === 1; } private function looksLikeTitle(string $input): bool { if (strlen($input) < 3) { return false; } return preg_match('/[A-Za-z]/', $input) === 1; } }