Wie können Leerzeichen in der PHP-Variablen entfernt werden?


78

Ich kenne diesen Kommentar PHP.net. Ich hätte gerne ein ähnliches Tool wie trfür PHP, damit ich es einfach ausführen kann

tr -d " " ""

Ich führe die Funktion erfolglos php_strip_whitespacedurch

$tags_trimmed = php_strip_whitespace($tags);

Ich führe die Regex-Funktion auch erfolglos aus

$tags_trimmed = preg_replace(" ", "", $tags);


1
@taztodgmail Schau dir die Daten an. Dies ist 2009 und der andere ist 2013. Das 2013 ist ein Duplikat davon.
Léo Léopold Hertz 25


1
sicher! Ich habe eine Reihe von Code, der es adressiert
ppostma1

Warum taucht das auf der Titelseite auf?
Jonathan dos Santos

Antworten:


47

Ein regulärer Ausdruck berücksichtigt standardmäßig keine UTF-8-Zeichen. Das \sMetazeichen berücksichtigt nur den ursprünglichen lateinischen Satz. Daher entfernt der folgende Befehl nur Tabulatoren, Leerzeichen, Zeilenumbrüche und neue Zeilen

// http://stackoverflow.com/a/1279798/54964
$str=preg_replace('/\s+/', '', $str);

Wenn UTF-8 zum Mainstream wird, wird dieser Ausdruck häufiger fehlschlagen / anhalten, wenn er die neuen utf-8-Zeichen erreicht, wobei Leerzeichen zurückbleiben, die \snicht berücksichtigt werden können.

Um mit den neuen Arten von Leerzeichen in Unicode / utf-8 fertig zu werden, ist eine umfangreichere Zeichenfolge erforderlich, um moderne Leerzeichen abzugleichen und zu entfernen.

Da reguläre Ausdrücke standardmäßig keine Mehrbytezeichen erkennen, können sie nur durch eine begrenzte Metazeichenfolge identifiziert werden, um zu verhindern, dass die Bytesegmente in anderen utf-8-Zeichen geändert werden ( \x80im Quad-Satz könnten alle \x80Subbytes ersetzt werden in intelligenten Anführungszeichen)

$cleanedstr = preg_replace(
    "/(\t|\n|\v|\f|\r| |\xC2\x85|\xc2\xa0|\xe1\xa0\x8e|\xe2\x80[\x80-\x8D]|\xe2\x80\xa8|\xe2\x80\xa9|\xe2\x80\xaF|\xe2\x81\x9f|\xe2\x81\xa0|\xe3\x80\x80|\xef\xbb\xbf)+/",
    "_",
    $str
);

Dies berücksichtigt und entfernt Tabulatoren, Zeilenumbrüche, vertikale Tabulatoren, Formularvorschübe, Wagenrückläufe, Leerzeichen und zusätzlich von hier :

nextline, nicht unterbrechende Leerzeichen, mongolischer Vokaltrenner, [en quad, em quad, en space, em space, Drei-pro-em-Raum, Vier-pro-em-Raum, Sechs-pro-em-Raum, Figurenraum, Interpunktionsraum , dünner Raum, Haarraum, Raum mit der Breite Null, Nicht-Joiner mit der Breite Null, Joiner mit der Breite Null], Zeilentrennzeichen, Absatztrennzeichen, schmaler Raum ohne Unterbrechung, mittlerer mathematischer Raum, Wort-Joiner, ideografischer Raum und Nicht-Breite Raum brechen.

Viele davon verursachen Chaos in XML-Dateien, wenn sie von automatisierten Tools oder Websites exportiert werden, die die Textsuche und -erkennung beeinträchtigen und unsichtbar in den PHP-Quellcode eingefügt werden können, wodurch der Parser zum nächsten Befehl (Absatz- und Zeilentrennzeichen) springt, der Zeilen verursacht Der zu überspringende Code führt zu zeitweiligen, ungeklärten Fehlern, die wir als "textuell übertragbare Krankheiten" bezeichnen.

[Es ist nicht mehr sicher, aus dem Web zu kopieren und einzufügen. Verwenden Sie einen Zeichenscanner, um Ihren Code zu schützen. lol]


1
So wie das? Ich habe versucht zu erklären, dass das alte nicht mehr so ​​funktioniert, wie es sollte
ppostma1

Ausgezeichnet! Können Sie bitte die Anzahl der Zeichen angeben, die Sie in Ihrem Set haben? - - Dies hilft uns zu erkennen, dass Sie wirklich einen vollständigen Satz dieser Zeichen haben. - - Ich habe Ihre Antwort akzeptiert, da sie jetzt vollständiger ist als die alte akzeptierte Antwort.
Léo Léopold Hertz 준영

Danke für die Hilfe @Masi!
ppostma1

1
Danke, ABER mit trim()sollte die richtige Antwort sein
Husam

1
Sollte es nicht die uFlagge in der Regex geben?

133

Abzustreifen alle Leerzeichen, können Sie einen regulären Ausdruck verwenden

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

Siehe auch diese Antwort für etwas, das Leerzeichen in UTF-8-Zeichenfolgen verarbeiten kann.


Alle anderen Lösungen. Dies (preg_replace) schlägt für mich fehl.
Kathir

Kathir, mit welcher Eingabe schlägt es fehl?
Alex

Warum setzen die Leute das +nach dem s? Du brauchst es dafür nicht.
Buttle Butkus

2
Es ist eine Größenordnung schneller als sie einzeln zu ersetzen, deshalb :)
Paul Dixon

1
Klingt so, als würden Sie versuchen, ein anderes Problem als das OP zu lösen. Dies ist eine Lösung zum Entfernen aller Leerzeichen aus einer Zeichenfolge.
Paul Dixon

26

Manchmal müssten Sie aufeinanderfolgende Leerzeichen löschen. Sie können es so machen:

$str = "My   name    is";
$str = preg_replace('/\s\s+/', ' ', $str);

Ausgabe:

My name is

Vielen Dank. Genau das, wonach ich gesucht habe
Lomse

15
$string = str_replace(" ", "", $string);

Ich glaube, preg_replace würde nach so etwas suchen [:space:]


8

Sie können die Trimmfunktion von PHP verwenden, um beide Seiten (links und rechts) zu trimmen.

 trim($yourinputdata," ");

Oder

trim($yourinputdata);

Sie können auch verwenden

ltrim() - Removes whitespace or other predefined characters from the left side of a string
rtrim() - Removes whitespace or other predefined characters from the right side of a string

System: PHP 4,5,7
Docs: http://php.net/manual/en/function.trim.php


1
Dies sollte die richtige Antwort sein, da dies nativ genau das ist, was vom OP verlangt wird. Es ist klein, sauber und "erweiterbar", indem es zusätzliches Zeichen zum Zuschneiden hinzufügt.
Louis Loudog Trottier

Beim Trimmen werden keine Leerzeichen innerhalb der Zeichenfolge entfernt, sondern nur links und rechts. Übrigens, Platz ist standardmäßig in Trimm, Sie müssen nicht das 2. Argument

6

Wenn Sie alle Leerzeichen überall aus $ -Tags entfernen möchten, warum nicht einfach:

str_replace(' ', '', $tags);

Wenn Sie neue Zeilen entfernen möchten und solche, die etwas mehr erfordern würden ...


2
Wenn Sie das Ergebnis keiner Variablen zuweisen, würde dies eigentlich nichts Nützliches bewirken.
Paul Dixon

Paul Dixon Was ist eine Variable? Ich programmiere, aber ich weiß nicht, was eine Variable ist ... Wofür ist sie nützlich? Kann ich das im Web finden? Ist es wichtig zu wissen, was es bedeutet? Warum setzen sie $ vor den Namen?
Ich will

2

Jede mögliche Option besteht darin, einen benutzerdefinierten Datei-Wrapper zum Simulieren von Variablen als Dateien zu verwenden. Sie können dies erreichen, indem Sie Folgendes verwenden:

1) Registrieren Sie zunächst Ihren Wrapper (nur einmal in der Datei, verwenden Sie ihn wie session_start ()):

stream_wrapper_register('var', VarWrapper);

2) Definieren Sie dann Ihre Wrapper-Klasse (sie ist sehr schnell geschrieben, nicht vollständig korrekt, funktioniert aber):

class VarWrapper {
  protected $pos = 0;
  protected $content;
  public function stream_open($path, $mode, $options, &$opened_path) {
    $varname = substr($path, 6);
    global $$varname;
    $this->content = $$varname;
    return true;
  }
  public function stream_read($count) {
    $s = substr($this->content, $this->pos, $count);
    $this->pos += $count;
    return $s;
  }
  public function stream_stat() {
    $f = fopen(__file__, 'rb');
    $a = fstat($f);
    fclose($f);
    if (isset($a[7])) $a[7] = strlen($this->content);
    return $a;
  }
}

3) Verwenden Sie dann eine beliebige Dateifunktion mit Ihrem Wrapper für das Protokoll var: // (Sie können sie auch zum Einschließen, Erfordernis usw. verwenden):

global $__myVar;
$__myVar = 'Enter tags here';
$data = php_strip_whitespace('var://__myVar');

Hinweis: Vergessen Sie nicht, Ihre Variable im globalen Bereich zu haben (wie global $ __ myVar).


Dies ist komplex, Anfänger möchten sich das vielleicht nicht ansehen. Aber um Mühe zu zeigen, werde ich dich positiv bewerten, damit die -1 in diesem Beitrag entfernt wird
Ironwind

Ja, ich weiß, dass es sehr komplex ist, aber es funktioniert und in einigen Fällen ist es wirklich mächtig. Und leider ist es die einzige Möglichkeit (anstatt Tempfiles zu erstellen, was hässlich ist), Variablen an Funktionen zu senden, die nur mit Dateien funktionieren (und php_strip_whitespace ist nicht die einzige). Zum Beispiel können Sie Code vor Bedarf ersetzen - Sie können einen eigenen "Pre-Compiler" für PHP erstellen, in dem Sie tun können, was Sie wollen. Ich benutze es und es wird während jahrelanger Programmierung sehr leistungsfähig und nützlich.
micropro.cz

global $$varname;Wie schrecklich es 2013 war
B001

1

Sie können es mit tun ereg_replace

 $str = 'This Is New Method Ever';
 $newstr = ereg_replace([[:space:]])+', '',  trim($str)):
 echo $newstr
 // Result - ThisIsNewMethodEver

ereg ist veraltet seit PHP 5.3

1

Sie verwenden auch die preg_replace_callbackFunktion. und diese Funktion ist identisch mit ihrem Geschwister, preg_replaceaußer dass sie eine Rückruffunktion annehmen kann, mit der Sie mehr Kontrolle darüber haben, wie Sie Ihre Ausgabe manipulieren.

$str = "this is a   string";

echo preg_replace_callback(
        '/\s+/',
        function ($matches) {
            return "";
        },
        $str
      );

1
Bei Stack Overflow empfiehlt es sich, eine Erklärung hinzuzufügen, warum Ihre Lösung funktionieren sollte. Weitere Informationen finden Sie unter Beantworten .
Samuel Liew

Können Sie bitte Beispiele hinzufügen, in welchen Fällen der Rückruf nützlich ist preg_replace?
Léo Léopold Hertz 준영


0

Ist ein alter Beitrag, kann aber so gemacht werden:

if(!function_exists('strim')) :
function strim($str,$charlist=" ",$option=0){
    $return='';
    if(is_string($str))
    {
        // Translate HTML entities
        $return = str_replace(" "," ",$str);
        $return = strtr($return, array_flip(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES)));
        // Choose trim option
        switch($option)
        {
            // Strip whitespace (and other characters) from the begin and end of string
            default:
            case 0:
                $return = trim($return,$charlist);
            break;
            // Strip whitespace (and other characters) from the begin of string 
            case 1:
                $return = ltrim($return,$charlist);
            break;
            // Strip whitespace (and other characters) from the end of string 
            case 2:
                $return = rtrim($return,$charlist);
            break;

        }
    }
    return $return;
}
endif;

Standardfunktionen von trim () können bei HTML-Entitäten problematisch sein. Aus diesem Grund habe ich die Funktion "Super Trim" geschrieben, mit der dieses Problem behoben werden kann. Außerdem können Sie wählen, ob Sie von der Anfangs-, End- oder Standseite der Saite aus zuschneiden möchten.


0

Eine einfache Möglichkeit, Leerzeichen aus der gesamten Zeichenfolge zu entfernen, besteht darin, die Explosionsfunktion zu verwenden und die gesamte Zeichenfolge mit einer for-Schleife zu drucken.

 $text = $_POST['string'];
            $a=explode(" ", $text);
            $count=count($a);
            for($i=0;$i<$count; $i++){

                echo $a[$i];
            }

0

Das Regex-Argument \ s ist nicht mit UTF-8-Multybyte-Zeichenfolgen kompatibel.

Dieses PHP-RegEx habe ich geschrieben, um dieses Problem mithilfe von PCRE-basierten Argumenten (Perl Compatible Regular Expressions) als Ersatz für UTF-8-Zeichenfolgen zu lösen:

function remove_utf8_whitespace($string) { 
   return preg_replace('/\h+/u','',preg_replace('/\R+/u','',$string)); 
}

- Anwendungsbeispiel -

Vor:

$string = " this is a test \n and another test\n\r\t ok! \n";

echo $string;

 this is a test
 and another test
         ok!

echo strlen($string); // result: 43

Nach:

$string = remove_utf8_whitespace($string);

echo $string;

thisisatestandanothertestok!

echo strlen($string); // result: 28

PCRE-Argumentliste

Quelle: https://www.rexegg.com/regex-quickstart.html

Character   Legend  Example Sample Match
\t  Tab T\t\w{2}    T     ab
\r  Carriage return character   see below   
\n  Line feed character see below   
\r\n    Line separator on Windows   AB\r\nCD    AB
    CD
\N  Perl, PCRE (C, PHP, R…): one character that is not a line break \N+ ABC
\h  Perl, PCRE (C, PHP, R…), Java: one horizontal whitespace character: tab or Unicode space separator      
\H  One character that is not a horizontal whitespace       
\v  .NET, JavaScript, Python, Ruby: vertical tab        
\v  Perl, PCRE (C, PHP, R…), Java: one vertical whitespace character: line feed, carriage return, vertical tab, form feed, paragraph or line separator      
\V  Perl, PCRE (C, PHP, R…), Java: any character that is not a vertical whitespace      
\R  Perl, PCRE (C, PHP, R…), Java: one line break (carriage return + line feed pair, and all the characters matched by \v)      

0

Es gibt einige spezielle Arten von Leerzeichen in Form von Tags. Sie müssen verwenden

$str=strip_tags($str);

um redundante Tags und Fehler-Tags zu entfernen und zuerst zu einer normalen Zeichenfolge zu gelangen.

Und verwenden

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

Es ist Arbeit für mich.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.