Substituir espaços usando regex em PHP
-
03-07-2019 - |
Pergunta
Eu sou muito novo para expressões regulares. Eu tenho um requisito para substituir os espaços em um pedaço de texto multi-line. As regras de substituição são as seguintes:
- Substitua todos os espaços no início de linha com um espaço sem quebras (
). - Substituir qualquer instância de espaços repetidas (mais do que um espaço em conjunto) com o mesmo número de não-quebrando-espaços.
- espaços únicos que não estão em início de linha permanecem intocados.
Eu usei o Regex treinador para construir o padrão de harmonização:
/( ){2,}|^( )/
Vamos supor que eu tenho esse texto de entrada:
asdasd asdasd asdas1
asda234 4545 54
34545 345 34534
34 345
Usando uma expressão regular PHP função de substituir (como preg_replace()
), eu quero começar esta saída:
asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345
Estou feliz fazendo substituições de texto simples utilizando expressões regulares, mas estou tendo problemas para trabalhar fora como substituir-várias vezes dentro do jogo, a fim de obter o resultado que eu desejo.
Solução
Eu acho que seria mais fácil encontrar cada espaço e substituí-lo. Para fazer isso, use "olhar em frente" e "olhar-behind" grupos.
Ou, encontrar um espaço (\x20
) que seja liderado por ou seguido por um único espaço em branco (\s
); mas, apenas a substituir o espaço.
$str = "asdasd asdasd asdas1\n asda234 4545 54\n 34545 345 34534\n34 345\n";
print preg_replace("/(?<=\s)\x20|\x20(?=\s)/", " ", $str);
(Optei por # 160 desde remarcação parses nbsp.)
Resultados em:
asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345
Para obter mais informações, consulte a PCRE e perlre .
responder aos comentários
Sprogz : No início, eu pensei o mesmo. Mas o exemplo mostra um "\n " => "\n "
entre a 1ª e 2ª linhas.
Outras dicas
Você pode usar o modificador /e
do PHP para executar algum código na substituição, como este:
$str = preg_replace('/( {2,}|^ )/em', 'str_repeat(" ", strlen("\1"))', $str);
Eu mudei a expressão regular para capturar os espaços.
O modificador /m
coloca-lo em modo multi-line, de modo ^
corresponde ao início de qualquer linha.