Terimi yalnızca kendi satırındaysa kaldırın


16

Bu bende var:

$text = '
   hello world
    
    hello
';

  Yalnızca kendi satırındaysa nasıl kaldırabilirim ? Yani yukarıdaki örnekle, ikincisi  kaldırılmalıdır. Sonuçlar şöyle olmalıdır:

$text = '
   hello world

    hello
';

Şimdiye kadar denediklerim

Via str_replace()şunları yapabilirim:

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

Ancak bu, yalnızca kendi satırındayken değil, tüm örneklerini kaldıracaktır  .


6
Şimdiye kadar denediklerimin güzel eklenmesi - bu sitede standart olmalıdır. +1
Gary Woods

2
@misorude Lütfen yaklaşımınıza bir cevap gönderin.
Henrik Petterson

1
@OfirBaruch Denedim $text = str_replace('\n'.' '.'\n', '', $text);ama işe yaramadı. Bkz .
Henrik Petterson

3
@FlashThunder str_replace()Deneyimimi değerlendirmek yerine neden bir yanıt göndermiyorsunuz? =)
Henrik Petterson

2
Ancak bu site genelinde bir sorun olduğunu düşünüyorsanız, toplulukla meta üzerinden tartışmanız gereken bir şeydir. Neden buraya itiyorsun?
Henrik Petterson

Yanıtlar:


10

Bu yaklaşımı zaten denedim ve istediğiniz çıktıyı alıyorum

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

Benim yerel çıktı:


hello world

 hello

bu boşlukları da kaldıracak ve yazar yalnızca kaldırmak istedi 
Flash Thunder

@FlashThunder çıktı olarak ne var tamamen çıktı ile hizalanmış soru tarafından talep edilmiştir. Çıktımın inital gereksinimle aynı olduğunu kontrol ederseniz :) Kodumu PHP 7'de çalıştırmayı denediniz mi? Başka çıktın var mı?
Merianos Nikos

Yazarın bir sekme / birkaç boşluk olduğunu bile fark etmediğini söyleyebilirim, çünkü o alandan sonra başka bir yorum istiyordu (ve bunu içermiyor).
Flash Thunder

@FlashThunder Biliyorum. Sadece bir vaka örneği soruyordum.
Henrik Petterson

1
üzgünüm bir missclick olmak zorunda
Flash Thunder

2

Benim yaklaşımım:

  1. Yeni satırlarda metin patlatma
  2. Dizideki her bir değeri kırp
  3. Her dizi öğesini değerle boşalt  
  4. Yeni çizgilerle emplode edin

Aşağıdaki kodla sonuçlanır:

$chunks = explode(PHP_EOL, $text);
$chunks = array_map('trim', $chunks);
foreach (array_keys($chunks, ' ') as $key) {
    $chunks[$key] = '';
}
$text = implode(PHP_EOL, $chunks);

2
Kodunuzun çıktısı sorulanla aynı değildir: / `` merhaba & nbsp; dünya & nbsp; merhaba `` `` Başlangıç ​​şartı,  tüm satırı uzaktan kumanda etmeden yalnızca boş metinle değiştirmektir :. Ayrıca, cevabınızı küçümseyen ben değilim :) Yorumum sadece kolay bir mesajdı :)
Merianos Nikos

1
Tamam, bunu düzeltmek için cevabımı güncelledim
JanP

1
Way
very

2

Belki böyle bir şey:

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

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

( PHP5 üzerinde çalışır , ancak bir şekilde PHP7'nin bazı sürümlerinde çalışmaz )


Alternatif:

<?php
    $lines = explode("\n",$text);
    foreach($lines as $n => $l)
        if(trim($l) == '&nbsp;')
            $lines[$n] = str_replace('&nbsp;','',$l);
    $text = implode("\n",$lines);
?>

1
Test ediyorum ve çalışmıyor :). Ayrıca size herhangi bir downvotes vermediğimi unutmayın. Bu sadece kolay bir yorum :) Çözümünüzü test ettikten sonra çıktı değişmeden kalır.
Merianos Nikos

@MerianosNikos nasıl olmaz ?? sandbox.onlinephpfunctions.com/code/…
Flash Thunder

1
Kodunuzu çalıştırdığımda yerelde bu şekilde aldım: pasteboard.co/IUkf2MK.png :)
Merianos Nikos

2
@MerianosNikos oh funny, PHP5 üzerinde çalışıyor ancak PHP7 üzerinde çalışmıyor.
Flash Thunder

Belki haklısın. Ben php 7 üzerinde çalıştırın.
Merianos Nikos

1

Satır sonu grafiklerinizi biliyorsanız ve &nbsp;her zaman yeni bir satır gelirse :

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


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

Çıktı (buradaki biçimlendirmede bazı boşluklar kayboldu):

   hello&nbsp;world

   &nbsp;hello

Uyarı: Öncesinde &nbsp;başka bir içerikle biten herhangi bir satır da etkilenecektir, bu nedenle bu ihtiyaçlarınızı karşılamayabilir.


1
Eğer yapışırsak bu aslında çok sağlam bir çözümdür str_replace()!
Henrik Petterson

bu mu? Çalışmazsa daha fazla durum görebilirim
Flash Thunder

@Progrock, daha sonra boşluklar için sayılması gereken bir şekilde ayarlanabilir &nbsp;mi? Örneğin:"&nbsp; \n"
Henrik Petterson

@HenrikPetterson no
Flash Thunder

1

Bunun için DOTALL ve MULTILINE değiştiricilerini, etrafa bakma iddialarıyla birlikte kullanarak normal bir ifade kullanabilirsiniz:

preg_replace("~(?sm)(?<=\n)\s*&nbsp;(?=\n)~", '',$text);
  • (?sm): DOTALL (s) MULTILINE (m)
  • (?<=\n): önceki satırsonu (maçın bir parçası değil)
  • \s*&nbsp;\s*: tek & nbsp; isteğe bağlı çevre boşluklu
  • (?=\n): sondaki satırsonu (maçın bir parçası değil)
>>> $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
   """
>>>

0

Satırlara bölünebilir ve &nbsp;yalnızca a &nbsp;ve boşluk içeren satırlardaki boş dizenin yerini alabilirsiniz .

Orijinal çizgi sonlarını yakalayarak saklayacağız.

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

Çıktı:

string(40) "
   hello&nbsp;world

   &nbsp;hello
"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.