Entfernen Sie den Begriff nur, wenn er sich in einer eigenen Zeile befindet

16

Ich habe das:

$text = '
   hello world
    
    hello
';

Wie entferne ich   nur, wenn es sich um eine eigene Leitung handelt? Mit dem obigen Beispiel  sollte also die zweite entfernt werden. Ergebnisse sollten sein:

$text = '
   hello world

    hello
';

Was ich bisher versucht habe

Via str_replace()kann ich:

$text = str_replace(' ', '', $text);

Dadurch werden jedoch alle Instanzen von entfernt  , nicht nur, wenn es sich um eine eigene Zeile handelt.

Henrik Petterson
quelle
6
Schöne Ergänzung von dem, was ich bisher versucht habe - sollte auf dieser Seite Standard sein. +1
Gary Woods
2
@misorude Bitte zögern Sie nicht, eine Antwort mit Ihrem Ansatz zu posten.
Henrik Petterson
1
@OfirBaruch Ich habe es versucht $text = str_replace('\n'.' '.'\n', '', $text);, aber nicht funktioniert. Siehe .
Henrik Petterson
3
@FlashThunder Warum postest du keine Antwort mit, str_replace()anstatt meine Erfahrung zu beurteilen ? =)
Henrik Petterson
2
@misorude Aber dies ist etwas, das Sie mit der Community bei Meta besprechen müssen, wenn Sie der Meinung sind, dass es sich um ein Site-weites Problem handelt. Warum drückst du es hier?
Henrik Petterson

Antworten:

10

Ich habe diesen Ansatz bereits ausprobiert und erhalte die gewünschte Ausgabe

// Your initial text
$text = '
   hello world
    
    hello
';

// Explode the text on each new line and get an array with all lines of the text
$lines = explode("\n", $text);

// Iterrate over all the available lines
foreach($lines as $idx => $line) {
    // Here you are free to do any if statement you want, that helps to filter
    // your text.

    // Make sure that the text doesn't have any spaces before or after and 
    // check if the text in the given line is exactly the same is the  
    if ( ' ' === trim($line) ) {
        // If the text in the given line is   then replace this line 
        // with and emty character
        $lines[$idx] = str_replace(' ', '', $lines[$idx]);
    }
}

// Finally implode all the lines in a new text seperated by new lines.
echo implode("\n", $lines);

Meine Ausgabe auf meinem lokalen ist folgende:


hello world

 hello
Merianos Nikos
quelle
Dadurch werden auch Leerzeichen entfernt, und der Autor wollte nur entfernen 
Flash Thunder
@FlashThunder Was ich als Ausgabe habe, ist vollständig auf die Ausgabe ausgerichtet, wurde von der Frage angefordert. Wenn Sie überprüfen, ob meine Ausgabe mit den ursprünglichen Anforderungen identisch ist :) Haben Sie versucht, meinen Code in PHP 7 auszuführen? Hast du eine andere Ausgabe?
Merianos Nikos
Ich würde sagen, dass der Autor nicht einmal weiß, dass es dort einen Tabulator / einige Leerzeichen gibt, da er in einem anderen Kommentar nach Leerzeichen danach gefragt hat (und das enthält er nicht).
Flash Thunder
@FlashThunder Ich bin mir bewusst. Ich habe nur nach einem Fallbeispiel gefragt.
Henrik Petterson
1
oh sorry musste ein missclick sein
Flash Thunder
2

Mein Ansatz wäre:

  1. Explodieren Sie Text in neuen Zeilen
  2. Schneiden Sie jeden Wert im Array
  3. Leeren Sie jedes Array-Element mit Wert  
  4. Implodiere mit neuen Zeilen

Daraus resultiert folgender Code:

$chunks = explode(PHP_EOL, $text);
$chunks = array_map('trim', $chunks);
foreach (array_keys($chunks, ' ') as $key) {
    $chunks[$key] = '';
}
$text = implode(PHP_EOL, $chunks);
JanP
quelle
2
Die Ausgabe Ihres Codes ist nicht identisch mit dem, was gefragt wird: / `` `hallo & nbsp; world & nbsp; hallo` `` Die anfängliche Anforderung besteht darin, nur den  durch leeren Text zu ersetzen , ohne die gesamte Zeile zu entfernen: /. Denken Sie auch daran, dass nicht ich Ihre Antwort abgelehnt habe :) Mein Kommentar war nur eine freundliche Nachricht :)
Merianos Nikos
1
Okay, ich habe meine Antwort aktualisiert, um dies zu korrigieren
Januar um 10:34 Uhr
1
Viel besser jetzt :)
Merianos Nikos
2

Vielleicht so etwas:

$text = preg_replace("~(^[\s]?|[\n\r][\s]?)( )([\s]?[\n\r|$])~s","$1$3",$text);

http://sandbox.onlinephpfunctions.com/code/f4192b95e0e41833b09598b6ec1258dca93c7f06

(das funktioniert auf PHP5 , aber irgendwie funktioniert es auf einigen Versionen von PHP7 nicht )


Alternative wäre:

<?php
    $lines = explode("\n",$text);
    foreach($lines as $n => $l)
        if(trim($l) == '&nbsp;')
            $lines[$n] = str_replace('&nbsp;','',$l);
    $text = implode("\n",$lines);
?>
Flash Thunder
quelle
1
Ich teste es und funktioniert nicht :). Denken Sie auch daran, dass ich Ihnen keine Abstimmungen gegeben habe. Das ist nur ein freundlicher Kommentar :) Die Ausgabe bleibt nach dem Testen Ihrer Lösung unverändert.
Merianos Nikos
@ MerianosNikos wie geht das nicht ?? sandbox.onlinephpfunctions.com/code/…
Flash Thunder
1
Das bekomme ich in meinem Lokal, wenn ich Ihren Code ausführe : pasteboard.co/IUkf2MK.png :)
Merianos Nikos
2
@ MerianosNikos oh lustig, funktioniert auf PHP5, funktioniert aber nicht auf PHP7.
Flash Thunder
Vielleicht hast du recht. Ich
starte
1

Wenn Sie Ihre Zeilenendezeichen kennen und auf Ihre &nbsp;immer eine neue Zeile folgt:

<?php
$text = '
   hello&nbsp;world
   &nbsp;
   &nbsp;hello
';


print str_replace("&nbsp;\n", "\n", $text);

Ausgabe (einige anfängliche Leerzeichen, die bei der Formatierung hier verloren gegangen sind):

   hello&nbsp;world

   &nbsp;hello

Vorsichtsmaßnahme: Jede Zeile, die mit einem &nbsp;vorangestellten anderen Inhalt endet, ist ebenfalls betroffen, sodass dies möglicherweise nicht Ihren Anforderungen entspricht.

Progrock
quelle
1
Dies ist tatsächlich eine sehr solide Lösung, wenn wir dabei bleiben str_replace()!
Henrik Petterson
ist es? Ich kann mehr Fälle sehen, in denen es nicht funktionieren würde
Flash Thunder
@Progrock ist es möglich, es so anzupassen, dass es für Leerzeichen nachher zählt &nbsp;? Zum Beispiel:"&nbsp; \n"
Henrik Petterson
@ HenrikPetterson no
Flash Thunder
1

Sie können hierfür einen regulären Ausdruck verwenden, indem Sie die Modifikatoren DOTALL und MULTILINE zusammen mit den Aussagen zum Umsehen verwenden:

preg_replace("~(?sm)(?<=\n)\s*&nbsp;(?=\n)~", '',$text);
  • (?sm): DOTALL (s) MULTILINE (m)
  • (?<=\n): vor der Newline (nicht Teil des Spiels)
  • \s*&nbsp;\s*: single & nbsp; mit optionalem umgebendem Leerzeichen
  • (?=\n): nachgestellte Newline (nicht Teil des Spiels)
>>> $text = '                                                                                               
 hello&nbsp;world                                                                                         
 &nbsp;                                                                                                   
 &nbsp;hello                                                                                           
 ';
=> """
   \n
      hello&nbsp;world\n
      &nbsp;\n
      &nbsp;hello\n
   """
>>> preg_replace("~(?sm)(?<=\n)\s*&nbsp;\s*(?=\n)~", '',$text);
=> """
   \n
      hello&nbsp;world\n
   \n
      &nbsp;hello\n
   """
>>>
Tom Regner
quelle
0

Sie können in Zeilen aufteilen und dann &nbsp;die leere Zeichenfolge in Zeilen ersetzen , die nur ein &nbsp;und ein Leerzeichen enthalten.

Wir behalten die ursprünglichen Zeilenenden bei, indem wir sie erfassen.

<?php

$text = '
   hello&nbsp;world
   &nbsp;
   &nbsp;hello
';
$lines = preg_split('@(\R)@', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
foreach($lines as &$v)
    if (trim($v) === '&nbsp;')
        $v = str_replace('&nbsp;', '', $v);

$result = implode($lines);
var_dump($result);

Ausgabe:

string(40) "
   hello&nbsp;world

   &nbsp;hello
"
Progrock
quelle