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 \Z
escape 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.
Si sta tentando di rimuovere * tutte * le schede indipendentemente o si desidera mantenere la formattazione colonnare? – Synetech
Penso che dovresti rivalutare le risposte e accettarne una diversa. – Jeff