Eliminar el término solo si está en su propia línea

16

Tengo esto:

$text = '
   hello world
    
    hello
';

¿Cómo elimino   solo si está en su propia línea? Entonces, con el ejemplo anterior, el segundo  debe eliminarse. Los resultados deberían ser:

$text = '
   hello world

    hello
';

Lo que he probado hasta ahora

Vía str_replace(), puedo:

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

Pero eso eliminará todas las instancias de  , no solo cuando está en su propia línea.

Henrik Petterson
fuente
66
Hermosa adición de lo que he probado hasta ahora , debería ser estándar en este sitio. +1
Gary Woods
2
@misorude Por favor, siéntase libre de publicar una respuesta con su enfoque.
Henrik Petterson
1
@OfirBaruch Lo intenté $text = str_replace('\n'.' '.'\n', '', $text);pero no funcionó. Ver .
Henrik Petterson
3
@FlashThunder ¿Por qué no publicas una respuesta usando en str_replace()lugar de juzgar mi experiencia? =)
Henrik Petterson
2
@misorude Pero esto es algo que tendrá que discutir con la comunidad en meta si cree que es un problema de todo el sitio. ¿Por qué lo empujas aquí?
Henrik Petterson

Respuestas:

10

Ya he probado este enfoque y obtengo el resultado que deseas

// 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);

Mi salida en mi local es esta:


hello world

 hello
Merianos Nikos
fuente
esto también eliminará espacios en blanco, y el autor quería eliminar solo 
Flash Thunder
@FlashThunder lo que tengo como salida está totalmente alineado con la salida solicitada por la pregunta. Si comprueba que mi salida es idéntica al requisito inicial :) ¿Intentó ejecutar mi código en PHP 7? ¿Tienes alguna otra salida?
Merianos Nikos
Diría que el autor ni siquiera es consciente de que hay una pestaña / pocos espacios allí, ya que estaba pidiendo en otro comentario espacio después (y no contiene eso).
Flash Thunder
@ FlashThunder Soy consciente. Solo estaba pidiendo un ejemplo de caso.
Henrik Petterson
1
oh, perdón, tenía que ser un clic erróneo
Flash Thunder
2

Mi enfoque sería:

  1. Descomponer texto en nuevas líneas
  2. Recorte cada valor en la matriz
  3. Vaciar cada elemento de la matriz con valor  
  4. Implode con nuevas líneas

Resultando en el siguiente 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
fuente
2
La salida de su código no es idéntica a la que se solicita: / `` `` hola & nbsp; world & nbsp; hello '' `` El requisito inicial es reemplazar solo  con texto vacío, sin remota toda la línea: /. Además, tenga en cuenta que no fui yo quien rechazó su respuesta :) Mi comentario fue solo un mensaje amistoso :)
Merianos Nikos
1
Bien, actualicé mi respuesta para corregir esto
enero
1
Mucho mejor ahora :)
Merianos Nikos
2

Tal vez algo como esto:

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

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

(que funciona en PHP5 , pero de alguna manera no funciona en algunas versiones de PHP7 )


La alternativa sería:

<?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
fuente
1
Lo pruebo y no funciona :). También tenga en cuenta que no le di ningún voto negativo. Eso es solo un comentario amigable :) La salida permanece sin cambios después de probar su solución.
Merianos Nikos
@MerianosNikos, ¿cómo no? sandbox.onlinephpfunctions.com/code/…
Flash Thunder
1
Eso es lo que me pasa en mi local cuando corro el código: pasteboard.co/IUkf2MK.png :)
Merianos Nikos
2
@MerianosNikos oh gracioso, funciona en PHP5 pero no funciona en PHP7.
Flash Thunder
Quizás estás en lo cierto. Lo ejecuto en php 7.
Merianos Nikos
1

Si conoce sus caracteres de fin de línea y &nbsp;siempre le sigue una nueva línea:

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


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

Salida (algunos espacios en blanco iniciales perdidos en el formato aquí):

   hello&nbsp;world

   &nbsp;hello

Advertencia: cualquier línea que termine con una &nbsp;con otro contenido anterior también se vería afectada, por lo que esto puede no satisfacer sus necesidades.

Progrock
fuente
1
¡Esta es realmente una solución muy sólida si nos atenemos str_replace()!
Henrik Petterson
¿Lo es? Puedo ver más casos en los que no funcionaría
Flash Thunder
@Progrock, ¿es posible ajustarlo de una manera que tome en cuenta los espacios posteriores &nbsp;? Por ejemplo:"&nbsp; \n"
Henrik Petterson
@HenrikPetterson no
Flash Thunder
1

Puede usar una expresión regular para esto, usando los modificadores DOTALL y MULTILINE junto con aserciones de búsqueda:

preg_replace("~(?sm)(?<=\n)\s*&nbsp;(?=\n)~", '',$text);
  • (?sm): DOTALL (s) MULTILINE (m)
  • (?<=\n): línea anterior (no es parte del partido)
  • \s*&nbsp;\s*: single & nbsp; con espacio en blanco circundante opcional
  • (?=\n): nueva línea final (no es parte del partido)
>>> $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
fuente
0

Puede dividir en líneas y luego sustituir &nbsp;la cadena vacía en las líneas que solo contienen un &nbsp;espacio en blanco.

Mantendremos las terminaciones de línea originales al capturarlas.

<?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);

Salida:

string(40) "
   hello&nbsp;world

   &nbsp;hello
"
Progrock
fuente