Remova o termo apenas se estiver em sua própria linha

16

Eu tenho isto:

$text = '
   hello world
    
    hello
';

Como removo   apenas se estiver em sua própria linha? Portanto, com o exemplo acima, o segundo  deve ser removido. Os resultados devem ser:

$text = '
   hello world

    hello
';

O que eu tentei até agora

Via str_replace(), eu posso:

$text = str_replace(' ', '', $text);

Mas isso removerá todas as instâncias  , não apenas quando estiver em sua própria linha.

Henrik Petterson
fonte
6
Adição bonita do que eu tentei até agora - deve ser padrão neste site. +1
Gary Woods
2
@misorude Sinta-se à vontade para postar uma resposta com sua abordagem.
Henrik Petterson
11
@OfirBaruch Tentei, $text = str_replace('\n'.' '.'\n', '', $text);mas não funcionou. Veja .
Henrik Petterson
3
@FlashThunder Por que você não publica uma resposta usando em str_replace()vez de julgar minha experiência. =)
Henrik Petterson
2
@misorude Mas isso é algo que você precisará discutir com a comunidade na meta se achar que é um problema em todo o site. Por que você está empurrando aqui?
Henrik Petterson

Respostas:

10

Eu já tentei essa abordagem e recebo a saída que você deseja

// Your initial text
$text = '
   hello world
    
    hello
';

// Explode the text on each new line and get an array with all lines of the text
$lines = explode("\n", $text);

// Iterrate over all the available lines
foreach($lines as $idx => $line) {
    // Here you are free to do any if statement you want, that helps to filter
    // your text.

    // Make sure that the text doesn't have any spaces before or after and 
    // check if the text in the given line is exactly the same is the  
    if ( ' ' === trim($line) ) {
        // If the text in the given line is   then replace this line 
        // with and emty character
        $lines[$idx] = str_replace(' ', '', $lines[$idx]);
    }
}

// Finally implode all the lines in a new text seperated by new lines.
echo implode("\n", $lines);

Minha saída no meu local é esta:


hello world

 hello
Merianos Nikos
fonte
isso removerá espaços em branco também, e o autor queria remover apenas 
Flash Thunder
@FlashThunder o que tenho como saída está totalmente alinhado com a saída foi solicitado pela pergunta. Se você verificar minha saída é idêntica ao requisito inicial :) Você tentou executar meu código no PHP 7? Você conseguiu outra saída?
Merianos Nikos
Eu diria que o autor nem está ciente de que há uma aba / poucos espaços, pois ele estava pedindo em outro comentário por espaço depois (e não contém isso).
Flash Thunder
@FlashThunder Estou ciente. Eu estava apenas pedindo um exemplo de caso.
Henrik Petterson
11
oh desculpe tinha que ser um clique errado
Flash Thunder
2

Minha abordagem seria:

  1. Explodir texto em novas linhas
  2. Aparar cada valor na matriz
  3. Esvaziar cada item da matriz com valor  
  4. Implode com novas linhas

Resultando no seguinte código:

$chunks = explode(PHP_EOL, $text);
$chunks = array_map('trim', $chunks);
foreach (array_keys($chunks, ' ') as $key) {
    $chunks[$key] = '';
}
$text = implode(PHP_EOL, $chunks);
JanP
fonte
2
A saída do seu código não é idêntica à que é solicitada: / `` hello & nbsp; world & nbsp; hello `` `` O requisito inicial é substituir apenas o  texto vazio, sem que a linha inteira seja remota: /. Além disso, tenha em mente que não sou eu que diminuímos a sua resposta :) Meu comentário foi apenas uma mensagem amigável :)
Merianos Nikos
11
Ok, atualizei minha resposta para corrigir isso
JanP
11
Muito melhor agora :)
Merianos Nikos
2

Talvez algo parecido com isto:

$text = preg_replace("~(^[\s]?|[\n\r][\s]?)( )([\s]?[\n\r|$])~s","$1$3",$text);

http://sandbox.onlinephpfunctions.com/code/f4192b95e0e41833b09598b6ec1258dca93c7f06

(isso funciona no PHP5 , mas de alguma forma não funciona em algumas versões do PHP7 )


Alternativa seria:

<?php
    $lines = explode("\n",$text);
    foreach($lines as $n => $l)
        if(trim($l) == '&nbsp;')
            $lines[$n] = str_replace('&nbsp;','',$l);
    $text = implode("\n",$lines);
?>
Flash Thunder
fonte
11
Eu testo e não funciona :). Lembre-se também de que não lhe dei votos negativos. Esse é apenas um comentário amigável :) A saída permanece inalterada após testar sua solução.
Merianos Nikos
@MerianosNikos how does it it ?? sandbox.onlinephpfunctions.com/code/…
Flash Thunder
11
É isso que recebo no meu local quando executo seu código: pasteboard.co/IUkf2MK.png :)
Merianos Nikos
2
@MerianosNikos oh engraçado, funciona no PHP5, mas não funciona no PHP7.
Flash Thunder
Talvez você esteja certo. Eu corro no php 7.
Merianos Nikos
1

Se você conhece seus caracteres de final de linha e &nbsp;sempre é seguido por uma nova linha:

<?php
$text = '
   hello&nbsp;world
   &nbsp;
   &nbsp;hello
';


print str_replace("&nbsp;\n", "\n", $text);

Saída (algum espaço em branco inicial perdido na formatação aqui):

   hello&nbsp;world

   &nbsp;hello

Advertência: qualquer linha que termine com um &nbsp;precedente com outro conteúdo também será afetada; portanto, isso pode não atender às suas necessidades.

Progrock
fonte
11
Esta é realmente uma solução muito sólida se continuarmos str_replace()!
Henrik Petterson
é isso? Eu posso ver mais casos em que não funcionaria
Flash Thunder
@Progrock é possível ajustá-lo de uma maneira que leva em conta os espaços depois &nbsp;? Por exemplo:"&nbsp; \n"
Henrik Petterson
@HenrikPetterson no
Flash Thunder
1

Você pode usar uma expressão regular para isso, usando os modificadores DOTALL e MULTILINE, juntamente com as asserções:

preg_replace("~(?sm)(?<=\n)\s*&nbsp;(?=\n)~", '',$text);
  • (?sm): DOTALL (s) MULTILINE (m)
  • (?<=\n): preceder a nova linha (não faz parte da partida)
  • \s*&nbsp;\s*: único & nbsp; com espaço em branco circundante opcional
  • (?=\n): nova linha à direita (não faz parte da partida)
>>> $text = '                                                                                               
 hello&nbsp;world                                                                                         
 &nbsp;                                                                                                   
 &nbsp;hello                                                                                           
 ';
=> """
   \n
      hello&nbsp;world\n
      &nbsp;\n
      &nbsp;hello\n
   """
>>> preg_replace("~(?sm)(?<=\n)\s*&nbsp;\s*(?=\n)~", '',$text);
=> """
   \n
      hello&nbsp;world\n
   \n
      &nbsp;hello\n
   """
>>>
Tom Regner
fonte
0

Você pode dividir em linhas e substituir &nbsp;a sequência vazia nas linhas que contêm apenas um &nbsp;espaço em branco e.

Manteremos as terminações de linha originais, capturando-as.

<?php

$text = '
   hello&nbsp;world
   &nbsp;
   &nbsp;hello
';
$lines = preg_split('@(\R)@', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
foreach($lines as &$v)
    if (trim($v) === '&nbsp;')
        $v = str_replace('&nbsp;', '', $v);

$result = implode($lines);
var_dump($result);

Resultado:

string(40) "
   hello&nbsp;world

   &nbsp;hello
"
Progrock
fonte