Número de telefone Regex em erro da âncora de Ruby com ^$
estou a tentar validar os números de telefone do Utilizador em Ruby com o seguinte formato:
123-456-7890
(123) 456-7890
123 456 7890
123.456.7890
+91 (123) 456-7890
usei a seguinte expressão regular:
/^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/
e obteve este erro ao tentar criar um utilizador na consola de Carris:
ArgumentError: a expressão regular fornecida é a utilização de âncoras multi-linhas (^ ou $), que podem representar um risco de segurança. Pretendia usar \a e \z ou esqueceu-se de adicionar a opção :multi-linha => verdadeiro?
Sei que há pedras preciosas para isto, mas ... gostaria de criar o modelo de usuário eu mesmo, tornando a validação do número de telefone semelhante ao E-mail:utilizador.rb
class User < ActiveRecord::Base
before_save { self.email = email.downcase }
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255 },
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
VALID_PHONE_NUMBER_REGEX = /^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/
validates :phone_number, presence: true, length: {maximum: 15},
format: { with: VALID_PHONE_NUMBER_REGEX }
has_secure_password
validates :password, length: { minimum: 6 }
end
Tentei mudar as âncoras para \a e \z porque é o que parece querer que eu faça, mas não consigo que a expressão regular aceite a gama de entradas de números de telefone que quero. Como posso corrigir o regex?
1 answers
O problema é nesta linha
VALID_PHONE_NUMBER_REGEX = /^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/
Deve ser alterado para
VALID_PHONE_NUMBER_REGEX = /\A(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}\z/
Pessoalmente, eu sugeriria para evitar tentar usar um único regex para validar todos esses formatos. Ou agrupar formatos semelhantes, e usar diferentes expressões regulares, ou normalizar a entrada e validar alguns formatos.
Você também pode querer dar uma olhada em falso.