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.

Foi útil?

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)/", "&#160;", $str);

(Optei por # 160 desde remarcação parses nbsp.)

Resultados em:

asdasd asdasd&#160;&#160;asdas1
&#160;asda234 4545&#160;&#160;&#160;&#160;54
&#160;&#160;34545 345&#160;&#160;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&nbsp;" 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("&nbsp;", 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top