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!