Rimuovi il termine solo se si trova sulla propria riga


16

Ho questo:

$text = '
   hello world
    
    hello
';

Come rimuovo   solo se si trova sulla propria linea? Quindi, con l'esempio sopra, il secondo  dovrebbe essere rimosso. I risultati dovrebbero essere:

$text = '
   hello world

    hello
';

Quello che ho provato finora

Tramite str_replace(), posso:

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

Ma questo rimuoverà tutte le istanze di  , non solo quando si trova sulla sua stessa linea.


6
Bella aggiunta di quello che ho provato finora - dovrebbe essere standard su questo sito. +1
Gary Woods,

2
@misorude Non esitate a pubblicare una risposta con il vostro approccio.
Henrik Petterson,

1
@OfirBaruch Ho provato $text = str_replace('\n'.' '.'\n', '', $text);ma non ha funzionato. Vedere .
Henrik Petterson,

3
@FlashThunder Perché non pubblichi una risposta usando str_replace()invece di giudicare la mia esperienza. =)
Henrik Petterson il

2
@misorude Ma questo è qualcosa di cui dovrai discutere con la community su meta se ritieni che sia un problema a livello di sito. Perché lo stai spingendo qui?
Henrik Petterson,

Risposte:


10

Ho già provato questo approccio e ottengo l'output desiderato

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

Il mio output sul mio locale è questo:


hello world

 hello

questo rimuoverà anche gli spazi bianchi e l'autore voleva rimuovere solo 
Flash Thunder,

@FlashThunder quello che ho come output è totalmente allineato con l'output è stato richiesto dalla domanda. Se controlli che il mio output sia identico al requisito iniziale :) Hai provato a eseguire il mio codice in PHP 7? Hai avuto altri risultati?
Merianos Nikos,

Direi che l'autore non è nemmeno consapevole che ci sia una scheda / alcuni spazi lì dentro, come stava chiedendo in altri commenti spazio dopo (e non lo contiene).
Flash Thunder,

@FlashThunder Sono consapevole. Stavo solo chiedendo un esempio di caso.
Henrik Petterson,

1
oh scusa, doveva essere un errore
Flash Thunder,

2

Il mio approccio sarebbe:

  1. Esplodi il testo su nuove righe
  2. Taglia ogni valore nella matrice
  3. Svuota ogni elemento dell'array con valore  
  4. Implode con nuove linee

Risultato nel seguente codice:

$chunks = explode(PHP_EOL, $text);
$chunks = array_map('trim', $chunks);
foreach (array_keys($chunks, ' ') as $key) {
    $chunks[$key] = '';
}
$text = implode(PHP_EOL, $chunks);

2
L'output del tuo codice non è identico a quello che ti viene chiesto: / `` ciao & nbsp; mondo & nbsp; ciao `` `Il requisito iniziale è sostituire solo il  testo vuoto, senza remoto l'intera riga: /. Inoltre, tieni presente che non sono io che ho
votato in negativo la

1
Ok, ho aggiornato la mia risposta per correggere questo
problema

1
Molto meglio ora :)
Merianos Nikos,

2

Forse qualcosa del genere:

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

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

(che funziona su PHP5 , ma in qualche modo non funziona su alcune versioni di PHP7 )


L'alternativa sarebbe:

<?php
    $lines = explode("\n",$text);
    foreach($lines as $n => $l)
        if(trim($l) == '&nbsp;')
            $lines[$n] = str_replace('&nbsp;','',$l);
    $text = implode("\n",$lines);
?>

1
Lo collaudo e non funziona :). Ricorda inoltre che non ti ho dato alcun voto negativo. Questo è solo un commento amichevole :) L'output rimane invariato dopo aver testato la soluzione.
Merianos Nikos,


1
Questo è quello che ottengo nel mio locale quando
eseguo il

2
@MerianosNikos oh divertente, funziona su PHP5 ma non funziona su PHP7.
Flash Thunder,

Forse hai ragione. Lo
eseguo

1

Se conosci i caratteri di fine riga e &nbsp;segui sempre una nuova riga:

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


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

Output (alcuni spazi bianchi iniziali persi nella formattazione qui):

   hello&nbsp;world

   &nbsp;hello

Avvertenza: qualsiasi riga che termina con una &nbsp;precedente con altri contenuti sarebbe influenzata, quindi questo potrebbe non soddisfare le tue esigenze.


1
Questa è in realtà una soluzione molto solida se ci atteniamo str_replace()!
Henrik Petterson,

è? Riesco a vedere più casi in cui non funzionerebbe
Flash Thunder,

@Progrock è possibile regolarlo in un modo in cui conta dopo gli spazi &nbsp;? Ad esempio:"&nbsp; \n"
Henrik Petterson, il

@HenrikPetterson no
Flash Thunder,

1

Puoi usare un'espressione regolare per questo, usando i modificatori DOTALL e MULTILINE insieme alle asserzioni look-around:

preg_replace("~(?sm)(?<=\n)\s*&nbsp;(?=\n)~", '',$text);
  • (?sm): DOTALL (s) MULTILINE (m)
  • (?<=\n): precedente a newline (non parte della partita)
  • \s*&nbsp;\s*: single & nbsp; con spazi bianchi circostanti opzionali
  • (?=\n): traline newline (non parte della partita)
>>> $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
   """
>>>

0

È possibile dividere in righe quindi sostituire &nbsp;la stringa vuota su righe che contengono solo &nbsp;ae spazi bianchi.

Manterremo le terminazioni di linea originali, acquisendole.

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

Produzione:

string(40) "
   hello&nbsp;world

   &nbsp;hello
"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.