2009-07-25 7 views
13

$data enthält Registerkarten, führende Leerzeichen und mehrere Leerzeichen. Ich möchte alle Registerkarten durch ein Leerzeichen ersetzen. Mehrere Leerzeichen mit einem einzelnen Leerzeichen und führende Leerzeichen entfernen.Wie ersetze ich Registerkarten durch Leerzeichen innerhalb von Variablen in PHP?

In der Tat somthing, die diese Eingangsdaten drehen würde:

[ asdf asdf  asdf   asdf ] 

in Ausgangsdaten:

[asdf asdf asdf asdf] 

Wie mache ich das?

+0

Versuchen Sie, * alle * Tabs zu entfernen, oder möchten Sie die Formatierung spalten? – Synetech

+0

Ich denke, du solltest die Antworten neu bewerten und eine andere akzeptieren. – Jeff

Antwort

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

Sie haben auch vergessen, Trim zu erwähnen, um führende Leerzeichen loszuwerden. Wahrscheinlich möchte ich auch ltrim erwähnen, da er nach führenden Räumen fragte, die beide Enden illustrierten. –

+0

Ja, danke für das Zeigen. In dem Beispiel wird gezeigt, dass sowohl führende als auch nachfolgende Leerzeichen entfernt werden sollten, sodass ich meinen Code aktualisiert habe. – RaYell

+0

hilfreich. [preg_replace] (http://php.net/manual/en/function.preg-replace.php) ersetzt standardmäßig alle Vorkommen des Musters, sofern Sie nicht den Limit-Parameter angeben. – JustinP

1
$data = trim($data); 

das Ihrer führenden (und Hinter) Räume entledigt.

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

Das macht jede Sammlung von einem oder mehreren Leerzeichen in nur ein Leerzeichen.

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

Das wird Ihre Tabs los.

+0

Wenn Sie '\ s' verwenden, brauchen Sie nicht' \ t' – Jeff

3

die eckigen Klammern Unter der Annahme, sind nicht Teil der Zeichenfolge und Sie verwenden sie nur zu Veranschaulichungszwecken, dann gilt:

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

Sie könnten in der Lage sein zu tun, dass eine einzige Regex mit, aber es werde ein ziemlich komplizierter Regex sein. Das obige ist viel einfacher.

Hinweis: Ich gehe auch davon aus, dass Sie "AB \ t \ tCD" (\ t ist ein Tab) nicht mit "AB CD" ersetzen möchten.

+0

Dies sollte akzeptiert werden Antworten. Ich habe meine Antwort nur gepostet, um Ihre Behauptung zu widerlegen, dass das Beschneiden mit 'preg_replace'" kompliziert "ist. – Jeff

+0

Schönheit Antwort. Vielen Dank. – mghhgm

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

Wenn Sie '\ s' verwenden brauchen Sie nicht' \ t' – Jeff

16

Trim, ersetzen Tabs und zusätzliche Räume mit einzelnen Leerzeichen:

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

das hat mir sehr geholfen, danke –

+0

Erstens, das ist ein klobiges Muster. Zweitens, wie Sie es geschrieben haben, wird es nicht erneut gescannt, und so wird es mehrere Leerzeichen für eine Ausführung von 'tab'' space' 'tab'' space' 'tab'' space' erzeugen. Hast du das getestet? – Jeff

-1

einfach diese regex verwenden

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

es alle Tabs und Leerzeichen durch ein Leerzeichen ersetzt,

hier Zeichen + in Regex bedeutet ein oder mehrere Male, patte rn bedeutet, dass, wo immer es zwei oder mehr Leerzeichen gibt, ersetzen Sie es durch ein Leerzeichen

+0

minus eins für ein Muster, das nicht mit einem einzelnen Tab übereinstimmt (und Ihre Lösung vor dem Posten nicht getestet wird). – Jeff

0

Diese Antwort nimmt die Frage komplett wörtlich: Es ist nur mit Leerzeichen und Tabs betroffen. Zugegeben, das OP wahrscheinlich möchte auch andere Arten von Leerzeichen enthalten, was getrimmt/komprimiert wird, aber lassen Sie uns so tun, als ob er die eingebetteten CR und/oder LF beibehalten möchte.

Zuerst, lassen Sie uns einige Konstanten einrichten. Dies ermöglicht eine einfache Verständlichkeit und Wartungsfreundlichkeit, falls Änderungen notwendig werden. Ich platziere einige zusätzliche Leerzeichen, damit Sie die Ähnlichkeiten und Unterschiede leichter vergleichen können.

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 

Wir verwenden \A und \Zescape characters den Anfang und das Ende des Objekts zu spezifizieren, anstelle der typischen ^$ und die leitungsorientierten meta-characters sind. Dies ist nicht so sehr, weil sie in diesem Fall so viel wie "defensive" Programmierung benötigt werden, sollte sich der Wert von S ändern, um sie in der Zukunft benötigt zu machen.

Jetzt für die geheime Zutat: Wir nutzen einige spezielle Semantik von preg_replace, nämlich (Hervorhebung hinzugefügt)

gehen nehmen Wenn es weniger Elemente in der Ersatz-Array als in der sind Muster-Array, werden alle zusätzlichen Muster durch eine leere Zeichenfolge ersetzt.

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

Anstatt also eine Musterzeichenfolge und Ersatz-String, wir sind ein Muster-Array und Ersatz-Array verwendet wird, die in den zusätzlichen Muster ergibt L und R getrimmt werden.

0

Falls Sie auch   entfernen müssen.

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