2009-07-25 9 views
13

$data contiene schede, spazi iniziali e spazi multipli. Desidero sostituire tutte le schede con uno spazio. Più spazi con un solo spazio e rimuovi gli spazi iniziali.Come posso sostituire le schede con gli spazi all'interno delle variabili in PHP?

Infatti quacosa che trasformerebbe questi dati in ingresso:

[ asdf asdf  asdf   asdf ] 

in dati di uscita:

[asdf asdf asdf asdf] 

Come posso fare questo?

+0

Si sta tentando di rimuovere * tutte * le schede indipendentemente o si desidera mantenere la formattazione colonnare? – Synetech

+0

Penso che dovresti rivalutare le risposte e accettarne una diversa. – Jeff

risposta

14
$data = trim(preg_replace('/\s+/g', '', $data)); 
+0

Hai anche dimenticato di menzionare trim per sbarazzarti degli spazi principali. Probabilmente vorrebbe menzionare anche ltrim, dal momento che ha chiesto spazi guida e ha illustrato entrambe le estremità. –

+0

Sì, grazie per averlo indicato. Nell'esempio è mostrato che entrambi gli spazi iniziali e finali dovrebbero essere rimossi, quindi ho aggiornato il mio codice. – RaYell

+0

utile. [preg_replace] (http://php.net/manual/en/function.preg-replace.php) utilizza di default tutte le occorrenze del pattern, a meno che non si specifichi il parametro limit. – JustinP

1
$data = trim($data); 

che si sbarazza dei vostri leader (e finali) gli spazi.

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

Ciò trasforma qualsiasi raccolta di uno o più spazi in un solo spazio.

$data = str_replace("\t", " ", $data); 

Questo elimina le schede.

+0

Se stai usando '\ s' non hai bisogno' \ t' – Jeff

3

Supponendo che le parentesi quadre non sono parte della stringa e si sta solo usando per scopi illustrativi, quindi:

$new_string = trim(preg_replace('!\s+!', ' ', $old_string)); 

Si potrebbe essere in grado di farlo con un unico regex ma sarà essere una regex abbastanza complicata. Quanto sopra è molto più semplice.

Nota: Sto anche assumendo che non si vuole sostituire "AB \ t \ TCD" (\ t è una scheda) con "AB CD".

+0

Questo dovrebbe essere accettato risposta. Ho postato la mia risposta solo per confutare la tua affermazione che il taglio con 'preg_replace' è" complicato ". – Jeff

+0

Risposta di bellezza. Grazie. – mghhgm

2
$new_data = preg_replace("/[\t\s]+/", " ", trim($data)); 
+0

se stai usando '\ s' non hai bisogno' \ t' – Jeff

16

Trim, sostituire le schede e gli spazi in eccesso con spazi singoli:

$data = preg_replace('/[ ]{2,}|[\t]/', ' ', trim($data)); 
+1

questo mi ha aiutato molto, grazie –

+0

Innanzitutto, questo è uno schema goffo. In secondo luogo, come lo hai scritto, non esegue la scansione, e quindi produrrà più spazi per una corsa di 'tab'' spazio' 'tab'' spazio'' tab'' spazio'. Hai provato questo? – Jeff

-1

basta usare questo regex

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

andrà a sostituire tutte le schede e gli spazi per uno spazio,

qui il segno + in regex significa una o più volte, patte significa che, ovunque ci siano due o più spazi, sostituirlo con uno spazio

+0

meno uno per un modello che non riesce ad abbinare una scheda solitaria (e per non testare la soluzione prima di postare). – Jeff

0

Questa risposta prende la domanda completamente alla lettera: è solo che riguarda gli spazi e le schede. Certo, l'OP probabilmente vuole anche includere altri tipi di spazi in ciò che viene rifilato/compressa, ma facciamo finta che vuole preservare incorporato CR e/o LF.

Per prima cosa, impostiamo alcune costanti. Ciò consentirà sia la facilità di comprensione e manutenibilità, qualora le modifiche diventino necessarie. Inserisco degli spazi extra in modo da poter confrontare più facilmente le somiglianze e le differenze.

define('S', '[ \t]+'  ); # Stuff you want to compress; in this case ONLY spaces/tabs 
define('L', '/\A'.S.'/' ); # stuff on the Left edge will be trimmed 
define('M', '/'.S.'/' ); # stuff in the Middle will be compressed 
define('R', '/'.S.'\Z/'); # stuff on the Right edge will be trimmed 
define('T', ' '   ); # what we want the stuff compressed To 

Usiamo \A e \Zescape characters per specificare l'inizio e la fine del soggetto, invece del tipico ^ e $ che sono line-oriented meta-characters. Questo non è tanto perché sono necessari in questo caso quanto la programmazione "difensiva", nel caso in cui il valore di S cambi per renderli necessari in futuro.

Ora per la salsa segreta: ci stanno andando a prendere vantaggio da alcune semantiche speciali di preg_replace, vale a dire (enfasi aggiunta)

Se ci sono meno elementi nella sostituzione matrice rispetto al array di pattern, ogni pattern in più verrà sostituito da una stringa vuota.

function trim_press($data){ 
    return preg_replace([ M, L, R ], [ T ], $data); 
} 

Così, invece di una stringa di modello e stringa di sostituzione, stiamo usando una matrice di modello e la sostituzione di matrice, che si traduce nei modelli supplementari L e R rifilato.

0

In caso sia necessario rimuovere anche  .

$data = trim(preg_replace('/\s+|nbsp;/g', '', $data)); 
Problemi correlati