Solución:
Tu estas usando ^
como delimitador? Probablemente quieras algo más como:
'/^[a-z]{6}[0-9a-z]{2}([0-9a-z]{3})?z/i'
Estructura
La última edición es ISO 9362: 2009 (con fecha de 2009-10-01). El código SWIFT tiene 8 u 11 caracteres, compuesto por:
4 letras: Código de institución o código bancario.
2 letras: código de país ISO 3166-1 alpha-2
2 letras o dígitos: código de ubicación
si el segundo carácter es “0”, normalmente es un BIC de prueba en lugar de un BIC utilizado en la red en vivo. si el segundo carácter es “1”, indica un participante pasivo en la red SWIFT; si el segundo carácter es “2”, normalmente indica un BIC de facturación inversa, en el que el destinatario paga por el mensaje en lugar de lo habitual. modo en el que el remitente paga por el mensaje.
3 letras o dígitos: código de sucursal, opcional (‘XXX’ para oficina principal)
(http://en.wikipedia.org/wiki/ISO_9362)
(definición diferente en German-Wiki http://de.wikipedia.org/wiki/ISO_9362)
2 letras o dígitos: código de ubicación El primer carácter no debe ser el dígito “0” o “1”. La letra ‘O’ no está permitida como segundo carácter. (Regex para esta definición: [2-9a-z][0-9a-np-z])
'/^[a-z]{6}[2-9a-z][0-9a-np-z]([a-z0-9]{3}|x{3})?$/i'
Este es el patrón SEPA oficial para validar BIC
[A-Z]{6,6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3,3}){0,1}