Rimuovi gli spazi bianchi in eccesso dall'interno di una stringa


132

Ricevo una stringa da una query del database, quindi rimuovo tutti i tag HTML, i ritorni a capo e le nuove righe prima di inserirla in un file CSV. L'unica cosa è che non riesco a trovare un modo per rimuovere lo spazio bianco in eccesso tra le stringhe.

Quale sarebbe il modo migliore per rimuovere i caratteri degli spazi bianchi interni?


6
Per favore, pubblica un campione di stringa originale e stringa desiderata.
Zote,

Puoi anche chiarire come deve essere l'output finale? Stai inserendo le virgole nei dati per CSV, ottenendole da un database con le virgole già presenti, inserendo le stringhe in una funzione che gestisce l'inserimento CSV, ecc.?
Frank DeRosa,

ok l'output finale deve essere una stringa con ogni parola separata da un singolo spazio bianco, al momento è uno spazio bianco multiplo.
giovedì

1
@Joe, non perderei tempo e inizierei a dare credito a tutti quelli che ti hanno aiutato prima! :)
Frankie,

Risposte:


286

Non sei sicuro di quello che vuoi, ma qui ci sono due situazioni:

  1. Se sono solo a che fare con l'eccesso whitespacesul all'inizio o alla fine della stringa è possibile utilizzare trim(), ltrim()o rtrim()per rimuoverlo.

  2. Se hai a che fare con spazi extra all'interno di una stringa, considera un preg_replacemultiplo whitespaces " "*con un singolo whitespace " ".

Esempio:

$foo = preg_replace('/\s+/', ' ', $foo);

62
$ foo = preg_replace ('/ \ s + /', '', $ foo);
genio

usando la $foo = preg_replace( '/\s+/', ' ', $foo );volontà ucciderai gli effetti dinl2br()
Waiyl Karim il

1
basta usare nl2br prima di usare preg_replace e dovresti essere pronto.
Lukas Liesis,

Typo / Escaper note - se il codice non rimuove spazi bianchi extra per te - assicurati di avere "\" prima di "s" :) alcune pagine di test php online lo rimuovono :)
jave.web

Questo dovrebbe essere CSS sicuro, giusto? Come in, questo comprimerebbe in modo sicuro una variabile che contiene una lunga stringa CSS multilinea?
David

50
$str = str_replace(' ','',$str);

Oppure, sostituisci con trattino basso, & nbsp; ecc ecc.


7
Questo rimuove tutto lo spazio bianco. Vuole solo normalizzare la stringa.
Svend,

12
Quello che stavo cercando (anche se non era la domanda)
Sevenearths,

@Gigala "Quale sarebbe il modo migliore per rimuovere i caratteri degli spazi bianchi interni?" era la domanda. Questa risposta lo soddisfa perfettamente.
Cory Dee,

1
@CoryDee È vero, per l'ultima frase singola. Ma nell'introduzione, la domanda è formulata come " spazio bianco in eccesso ", con enfasi sull'eccesso. Hai finito per soddisfare il problema REALE dell'OP, quindi non ha molta importanza, ma fintanto che diventeremo tecnici al riguardo ...
Spencer Ruskin,

Questo non funziona se il conteggio degli spazi è numero pari , diciamo: Hi Earthcon 4 posti in mezzo diventerà: HiEarth. Questo non risolve il mio problema in relazione alla domanda.
JJ Labajo

26

$str = trim(preg_replace('/\s+/',' ', $str));

La riga di codice sopra rimuoverà gli spazi extra , così come gli spazi iniziali e finali.


25

nessuno degli altri esempi ha funzionato per me, quindi ho usato questo:

trim(preg_replace('/[\t\n\r\s]+/', ' ', $text_to_clean_up))

questo sostituisce tutte le schede, le nuove linee, i doppi spazi ecc. in 1 semplice spazio.


Grazie, @ wp78de ma per qualsiasi motivo, ho avuto problemi con Just \s+. Anche se è stato nel 2014, quindi forse è cambiato, non ho toccato PHP negli ultimi 3 anni, non posso commentare ma lascerò la risposta corrente mentre era una soluzione e potrebbe essere ancora in alcuni casi.
Lukas Liesis,

9

Se si desidera sostituire solo più spazi in una stringa, ad esempio: "this string have lots of space . " E si prevede che la risposta sia "this string have lots of space", è possibile utilizzare la seguente soluzione:

$strng = "this string                        have lots of                        space  .   ";

$strng = trim(preg_replace('/\s+/',' ', $strng));

echo $strng;

5

Vi sono difetti di sicurezza nell'utilizzo di preg_replace (), se si ottiene il payload dall'input dell'utente [o da altre fonti non attendibili]. PHP esegue l'espressione regolare con eval (). Se la stringa in arrivo non è adeguatamente disinfettata, l'applicazione rischia di essere soggetta all'iniezione di codice .

Nella mia stessa applicazione, invece di preoccuparmi di disinfettare l'input (e dato che mi occupo solo di stringhe brevi), ho invece creato una funzione leggermente più intensiva del processore, sebbene sia sicura, poiché non valuta nulla ().

function secureRip(string $str): string { /* Rips all whitespace securely. */
  $arr = str_split($str, 1);
  $retStr = '';
  foreach ($arr as $char) {
    $retStr .= trim($char);
  }
  return $retStr;
}

Esegue solo usando eval se si specifica la 'e' modifyier: php.net/manual/en/... si è anche si dice che "Questa funzione è stata sconsigliata a PHP 5.5.0, e rimossi a partire dal PHP 7.0.0. " Quindi non puoi più valutare cose in preg_replace.
ADJenks il


2

Puoi usare:

$str = trim(str_replace("  ", " ", $str));

Ciò rimuove gli spazi bianchi extra da entrambi i lati della stringa e converte due spazi in uno all'interno della stringa. Nota che questo non convertirà tre o più spazi di fila in uno! Un altro modo che posso suggerire è usare impllo ed esplodere che è più sicuro ma assolutamente non ottimale!

$str = implode(" ", array_filter(explode(" ", $str)));

Il mio suggerimento è usare un ciclo nativo per o usare regex per fare questo tipo di lavoro.


Ciò non converte correttamente più spazi in cui lo spazio è più lungo di due spazi.
mikeybeck,

1

Per espandere la risposta di Sandip, ho avuto un sacco di stringhe mostrate nei registri che sono stati erroneamente codificati in bit.ly. Intendevano codificare solo l'URL, ma inserire un handle di Twitter e altre cose dopo uno spazio. Sembrava così

? productID =26%20via%20@LFS

Normalmente, questo non sarebbe un problema, ma sto ricevendo molti tentativi di iniezione SQL, quindi reindirizzo tutto ciò che non è un ID valido a un 404. Ho usato il metodo preg_replace per trasformare la stringa productID non valida in un productID valido.

$productID=preg_replace('/[\s]+.*/','',$productID);

Cerco uno spazio nell'URL e quindi rimuovo tutto dopo di esso.


0

Di recente ho scritto una semplice funzione che rimuove lo spazio bianco in eccesso dalla stringa senza espressione regolare implode(' ', array_filter(explode(' ', $str))).


-1
$str = "I      am a PHP   Developer";
$str_length = strlen($str);
$str_arr = str_split($str);
for ($i = 0; $i < $str_length; $i++) {
   if (isset($str_arr[$i + 1])  && $str_arr[$i] == ' ' && $str_arr[$i] == $str_arr[$i + 1]) {
       unset($str_arr[$i]);
   } 
   else {
     continue;
   }
}
echo implode("", $str_arr);
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.