Usuń termin tylko wtedy, gdy jest na swojej linii

16

Mam to:

$text = '
   hello world
    
    hello
';

Jak usunąć   tylko wtedy, gdy jest na swojej linii? Tak więc w powyższym przykładzie drugi  należy usunąć. Wyniki powinny być:

$text = '
   hello world

    hello
';

Co próbowałem do tej pory

Poprzez str_replace()mogę:

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

Spowoduje to jednak usunięcie wszystkich wystąpień  , nie tylko wtedy, gdy będzie on na swojej linii.

Henrik Petterson
źródło
6
Piękny dodatek tego , co próbowałem do tej pory - powinien być standardem na tej stronie. +1
Gary Woods
2
@misorude Prosimy o przesłanie odpowiedzi wraz ze swoim podejściem.
Henrik Petterson
1
@OfirBaruch Próbowałem, $text = str_replace('\n'.' '.'\n', '', $text);ale nie działałem . Zobaczyć .
Henrik Petterson
3
@FlashThunder Dlaczego nie opublikujesz odpowiedzi używając str_replace()zamiast oceniać moje doświadczenia. =)
Henrik Petterson
2
@misorude Ale to jest coś, o czym musisz porozmawiać ze społecznością na stronie meta, jeśli uważasz, że jest to problem dotyczący całej witryny. Dlaczego go tu popychasz?
Henrik Petterson

Odpowiedzi:

10

Próbowałem już tego podejścia i otrzymuję pożądany efekt

// 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);

Moje wyniki na moim lokalnym są następujące:


hello world

 hello
Merianos Nikos
źródło
spowoduje to również usunięcie spacji, a autor chciał usunąć tylko 
Flash Thunder
@FlashThunder To, co mam jako wynik, jest całkowicie dostosowane do wyniku, zostało zadane przez pytanie. Jeśli sprawdzisz, czy moje wyjście jest identyczne z wymaganiem początkowym :) Czy próbowałeś uruchomić mój kod w PHP 7? Czy masz jakieś inne wyniki?
Merianos Nikos
Powiedziałbym, że autor nawet nie zdaje sobie sprawy, że jest tam tabulator / kilka spacji, ponieważ prosił w innym komentarzu o spację po nim (i nie zawiera tego).
Flash Thunder
@FlashThunder Jestem świadomy. Właśnie prosiłem o przykładowy przypadek.
Henrik Petterson
1
o, przepraszam, musiałem być missclick
Flash Thunder
2

Moje podejście to:

  1. Rozbij tekst w nowych liniach
  2. Przytnij każdą wartość w tablicy
  3. Opróżnij każdy element tablicy wartością  
  4. Implode z nowymi liniami

Wynikające z następującego kodu:

$chunks = explode(PHP_EOL, $text);
$chunks = array_map('trim', $chunks);
foreach (array_keys($chunks, ' ') as $key) {
    $chunks[$key] = '';
}
$text = implode(PHP_EOL, $chunks);
JanP
źródło
2
Dane wyjściowe kodu nie są identyczne z zadawanymi: / `` hello & nbsp; world & nbsp; hello `` `Pierwszym wymaganiem jest zastąpienie tylko  pustym tekstem, bez zdalnej całej linii: /. Pamiętaj też, że to nie ja oceniłem twoją odpowiedź :) Mój komentarz był tylko przyjazną wiadomością :)
Merianos Nikos
1
Dobra, zaktualizowałem swoją odpowiedź, aby to naprawić
stycznia
1
O wiele lepiej teraz :)
Merianos Nikos
2

Może coś takiego:

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

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

(działa na PHP5 , ale jakoś nie działa na niektórych wersjach PHP7 )


Alternatywą byłoby:

<?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
źródło
1
Testuję to i nie działa :). Pamiętaj też, że nie oddałem ci żadnych głosów negatywnych. To tylko przyjazny komentarz :) Wynik pozostaje niezmieniony po przetestowaniu rozwiązania.
Merianos Nikos
@MerianosNikos jak to nie? sandbox.onlinephpfunctions.com/code/…
Flash Thunder
1
To co mi się w moim lokalnym gdy uruchamiam kod: pasteboard.co/IUkf2MK.png :)
Merianos Nikos
2
@MerianosNikos oh śmieszne, działa na PHP5, ale nie działa na PHP7.
Flash Thunder,
Może masz rację. Używam go na php 7.
Merianos Nikos
1

Jeśli znasz znaki końca linii, a po tobie &nbsp;zawsze pojawia się nowa linia:

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


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

Dane wyjściowe (niektóre początkowe białe znaki zostały utracone podczas formatowania tutaj):

   hello&nbsp;world

   &nbsp;hello

Zastrzeżenie: &nbsp;wpłynie to również na każdą linię, która kończy się poprzednią treścią, więc może to nie spełniać twoich potrzeb.

Progrock
źródło
1
To jest naprawdę bardzo solidne rozwiązanie, jeśli będziemy się trzymać str_replace()!
Henrik Petterson
czy to jest Widzę więcej przypadków, w których to nie zadziała
Flash Thunder,
@Progrock czy można to zmienić w taki sposób, aby uwzględniała spacje po &nbsp;? Na przykład:"&nbsp; \n"
Henrik Petterson
@HenrikPetterson no
Flash Thunder
1

Możesz do tego użyć wyrażenia regularnego, używając modyfikatorów DOTALL i MULTILINE wraz z asertywnymi stwierdzeniami:

preg_replace("~(?sm)(?<=\n)\s*&nbsp;(?=\n)~", '',$text);
  • (?sm): DOTALL (s) MULTILINE (m)
  • (?<=\n): poprzedni znak nowej linii (nie jest częścią dopasowania)
  • \s*&nbsp;\s*: single & nbsp; z opcjonalnym otaczającym spacją
  • (?=\n): końcowy znak nowej linii (nie jest częścią dopasowania)
>>> $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
źródło
0

Możesz podzielić na linie, a następnie zastąpić &nbsp;pusty ciąg w wierszach, które zawierają tylko &nbsp;spacje.

Zachowamy oryginalne zakończenia linii, przechwytując je.

<?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);

Wynik:

string(40) "
   hello&nbsp;world

   &nbsp;hello
"
Progrock
źródło