Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

preg_replace não funcionando | expressões regulares | regex

Alguém poderia me ajudar a descobrir o motivo pelo qual o preg_replace não está substituindo o "(11)" do array por "(XX)"

<?php

$telefones = ['(11) 5550 - 5550', '(11) 96660 - 6660', '(11) 90000 - 0000'];

foreach ($telefones as $telefone){

    $regex = '/^\(([0-9]{2})\) (9?[0-9]{4} - [0-9]{4})$/';

    $telefoneValido = preg_match
        ( $regex,
        $telefone
        );


    if ($telefoneValido){
        echo 'Telefone Valido'.PHP_EOL;
    } else  echo 'Telefone Invalido'.PHP_EOL;
   

echo preg_replace(
    $regex,
    '(XX) \2',
    $telefone .PHP_EOL
);
}
3 respostas
solução!

Olá Guilherme!

O problema que você está enfrentando com o preg_replace não substituindo o "(11)" do array por "(XX)" é devido ao uso do acento circunflexo (^) no padrão de regex.

Quando você usa o acento circunflexo (^) no início do padrão, ele informa que a correspondência deve ocorrer no início da string. No seu caso, os números de telefone estão no meio da string, então o padrão não está correspondendo corretamente.

Para corrigir isso, você pode remover o acento circunflexo (^) do início do padrão. Isso permitirá que o preg_replace faça a substituição correta no meio da string, onde os números de telefone estão localizados.

Aqui está o código corrigido:

<?php

$telefones = ['(11) 5550 - 5550', '(11) 96660 - 6660', '(11) 90000 - 0000'];

foreach ($telefones as $telefone) {
    $regex = '/\(([0-9]{2})\) (9?[0-9]{4} - [0-9]{4})$/';

    $telefoneValido = preg_match($regex, $telefone);

    if ($telefoneValido) {
        echo 'Telefone Valido'.PHP_EOL;
    } else {
        echo 'Telefone Invalido'.PHP_EOL;
    }

    echo preg_replace($regex, '(XX) $2', $telefone) . PHP_EOL;
}

Com essa alteração, o preg_replace irá substituir corretamente o "(11)" por "(XX)" no meio da string, mantendo o restante do número de telefone intacto.

Espero que isso ajude a resolver o problema! Se você tiver mais dúvidas ou precisar de mais assistência, estou aqui para ajudar!

Seu código parece estar funcionando, Guilherme: https://3v4l.org/WLdCY

Realmente funcinou depois do de retirar o "^", mas engraçado que no site que o Vinicius Dias Mandou funcionou com o "^".