Considere este caso:
$que = "aa bb33cc 5.po";
$que = preg_replace("/([^0-9,. ])([0-9,.])/","$1 $2",$que);
$que = preg_replace("/([0-9,.])([^0-9,. ])/","$1 $2",$que);
echo $que;
Decidi juntar essas 2 regex aqui:
$que = "aa bb33cc 5.po";
$que = preg_replace("/(?:([^0-9,. ])([0-9,.])|([0-9,.])([^0-9,. ]))/","$1 $2$3 $4",$que);
echo $que;
No entanto, o primeiro caso retorna aa bb 33 cc 5. po
e o segundo retorna aa bb 3 3 cc 5 . po
. Por quê? Como posso fazer o segundo retornar o mesmo que o primeiro?
Considere esta solução (se ela corresponder às suas restrições):
A ideia é capturar cegamente eventuais caracteres brancos que talvez já estejam em volta dos números e substituí-los por um espaço. Então você usa a
trim
função para remover eventuais espaços no início ou no fim da string.Note que
[0-9,.]+
descrever um número pode ser problemático, pois ele corresponde a um único ponto (também). Se ocorrer um problema com isso, use um subpadrão mais descritivo como:\d[\d,.]*|[,.]*+[\d,.]+
(que garante que haja pelo menos um dígito).Você simplesmente usa dois espaços no padrão de substituição. Coloque as referências posteriores onde elas devem estar:
Entretanto, no seu caso, eu substituiria os padrões de consumo por lookarounds e me livraria completamente das referências reversas:
Como você não consome nenhum texto, tudo o que você precisa é usar um espaço no padrão de substituição.
Entretanto, em outros cenários, você pode querer usar um grupo de redefinição de ramificação :
onde cada alternativa compartilha os mesmos IDs para capturar grupos.
Veja a demonstração do PHP :
Todos os resultados em
aa bb 33 cc 5. po
.