Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom, minha dúvida é mais didática do que aplicada, mas vamos ao assunto. Não entrarei em detalhes sobre como criar uma expressão regular, e sim como usar backreference.
Para criação de máscaras, pode-se utilizar preg_replace e backreference (referência passada, referência anterior ou retrovisor, vai de cada autor) para um padrão. Vamos ao exemplo de um telefone +55 (54) 9999-9999.
Número sem a máscara:
555499999999
Expressão regular para a máscara com backreference
preg_replace( '/^([\d]{2})([\d]{2})([\d]{4})([\d]{4})$/', '+${1} (${2}) ${3}-${4}', '555499999999');
A expressão, nada mais faz que "casar" os conjuntos de caracteres, armazena-os, e após é utilizado no "retrovisor" ${1} sendo o primeiro grupo e assim sucessivamente.
Agora a minha aplicação prática. Eu recebo de uma lista em excel totalmente desformatada que pode concluir de 1 a n números de telefone no mesmo campo.
Imaginemos que os campo seja assim:
+55 (54) 9999-9999 / +55 (54) 9999-9999 / +55 (54) 9999-9999
+55 (54) 9999-9999 / +55 (54) 9999-9999
+55 (54) 9999-9999 / +55 (54) 9999-9999 / +55 (54) 9999-9999 / +55 (54) 9999-9999
+55 (54) 9999-9999
Beleza, casar isso (somente números como é próprio de trablhar) é extremamente fácil:
preg_match( '/^(([\d]{2})([\d]{2})([\d]{4})([\d]{4})){1,}$/', '555499999999');
O código acima irá casar o conjunto de caracteres mesmo se repetirem infinitamente.
O meu problema/dúvida é, como eu posso referenciar essa repetição no retrovisor? Especificamente no PHP.
Algumas linguagens de programação implementam laços a nível de programação e não da expressão regular
Não vou morrer se não houver como, mas gostaria de saber se existe algo a nível de "expressão regular".
A solução mais viável a seguinte
preg_match( '/^([\d]{12}){1,}$/', $telefones, $dados );
$telefones = array();
foreach( $dados AS $telefone ) {
$telefones[] = preg_replace( '/^([\d]{2})([\d]{2})([\d]{4})([\d]{4})$/', '+${1} (${2}) ${3}-${4}', $telefone );
}
echo implode( ' / ', $telefones );
Acho interessante exmplorar o máximo as funções pouco utilizadas. Poucos programadores utilizam o recurso de backreference.
Carregando comentários...