Hapus istilah hanya jika ada di jalurnya sendiri

16

Aku punya ini:

$text = '
   hello world
    
    hello
';

Bagaimana cara menghapus   hanya jika itu pada jalurnya sendiri? Jadi dengan contoh di atas, yang kedua  harus dihapus. Hasilnya harus:

$text = '
   hello world

    hello
';

Apa yang saya coba sejauh ini

Melalui str_replace(), saya dapat:

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

Tapi itu akan menghapus semua contoh  , tidak hanya ketika itu pada jalurnya sendiri.

Henrik Petterson
sumber
6
Tambahan indah dari Apa yang saya coba sejauh ini - harus menjadi standar di situs ini. +1
Gary Woods
2
@misorude Silakan mengirim jawaban dengan pendekatan Anda.
Henrik Petterson
1
@ Firfir Saya mencoba $text = str_replace('\n'.' '.'\n', '', $text);tetapi tidak berhasil. Lihat .
Henrik Petterson
3
@FlashThunder Mengapa Anda tidak memposting jawaban menggunakan str_replace()bukan menilai pengalaman saya. =)
Henrik Petterson
2
@misorude Tapi ini adalah sesuatu yang perlu Anda diskusikan dengan komunitas saat meta jika Anda merasa ini adalah masalah di seluruh situs. Mengapa Anda mendorongnya ke sini?
Henrik Petterson

Jawaban:

10

Saya sudah mencoba pendekatan ini dan saya mendapatkan output yang Anda inginkan

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

Output saya di lokal saya adalah ini:


hello world

 hello
Merianos Nikos
sumber
ini akan menghapus spasi putih juga, dan penulis hanya ingin menghapus 
Flash Thunder
@ FlashThunder apa yang saya miliki sebagai output benar-benar selaras dengan output yang telah diminta oleh pertanyaan. Jika Anda memeriksa output saya identik dengan persyaratan awal :) Apakah Anda mencoba menjalankan kode saya di PHP 7? Apakah Anda mendapat output lain?
Merianos Nikos
Saya akan mengatakan bahwa penulis bahkan tidak menyadari bahwa ada tab / beberapa spasi di sana, karena ia meminta komentar lain untuk spasi setelahnya (dan itu tidak mengandung itu).
Flash Thunder
@FlashThunder Saya sadar. Saya hanya meminta contoh kasus.
Henrik Petterson
1
oh maaf harus menjadi missclick
Flash Thunder
2

Pendekatan saya adalah:

  1. Meledak teks pada baris baru
  2. Pangkas setiap nilai dalam array
  3. Kosongkan setiap item array dengan nilai  
  4. Implode dengan baris baru

Menghasilkan kode berikut:

$chunks = explode(PHP_EOL, $text);
$chunks = array_map('trim', $chunks);
foreach (array_keys($chunks, ' ') as $key) {
    $chunks[$key] = '';
}
$text = implode(PHP_EOL, $chunks);
JanP
sumber
2
Output dari kode Anda tidak identik dengan apa yang ditanyakan: / `` `halo & nbsp; world & nbsp; halo` `` Persyaratan awal adalah hanya mengganti  dengan teks kosong, tanpa remote seluruh baris: /. Juga, ingatlah bahwa bukan saya yang menurunkan jawaban Anda :) Komentar saya hanyalah pesan yang ramah :)
Merianos Nikos
1
Oke, saya memperbarui jawaban saya untuk memperbaiki ini
JanP
1
Jauh lebih baik sekarang :)
Merianos Nikos
2

Mungkin kira-kira seperti ini:

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

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

(yang bekerja pada PHP5 , tetapi entah bagaimana tidak berfungsi pada beberapa versi PHP7 )


Alternatifnya adalah:

<?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
sumber
1
Saya mengujinya dan tidak berhasil :). Juga perlu diingat saya tidak memberi Anda downvotes. Itu hanya komentar ramah :) Outputnya tetap tidak berubah setelah menguji solusi Anda.
Merianos Nikos
@MerianosNikos bagaimana tidak ?? sandbox.onlinephpfunctions.com/code/…
Flash Thunder
1
Itulah yang saya dapatkan di lokal saya ketika saya menjalankan kode Anda: pasteboard.co/IUkf2MK.png :)
Merianos Nikos
2
@MerianosNikos oh lucu, bekerja di PHP5 tetapi tidak berfungsi di PHP7.
Flash Thunder
Mungkin Anda benar. Saya menjalankannya di php 7.
Merianos Nikos
1

Jika Anda tahu batas karakter baris Anda, dan Anda &nbsp;selalu diikuti oleh baris baru:

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


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

Output (beberapa spasi putih awal hilang dalam pemformatan di sini):

   hello&nbsp;world

   &nbsp;hello

Peringatan: Setiap baris yang diakhiri dengan &nbsp;konten lain sebelumnya juga akan terpengaruh, jadi ini mungkin tidak memenuhi kebutuhan Anda.

Progrock
sumber
1
Ini sebenarnya solusi yang sangat solid jika kita tetap bertahan str_replace()!
Henrik Petterson
Apakah itu? Saya dapat melihat lebih banyak kasing ketika itu tidak berfungsi
Flash Thunder
@Progrock apakah mungkin untuk menyesuaikannya dengan cara yang dibutuhkan setelah spasi &nbsp;? Misalnya:"&nbsp; \n"
Henrik Petterson
@HenrikPetterson no
Flash Thunder
1

Anda dapat menggunakan ekspresi reguler untuk ini, menggunakan pengubah DOTALL dan MULTILINE bersama-sama dengan pernyataan melihat-lihat:

preg_replace("~(?sm)(?<=\n)\s*&nbsp;(?=\n)~", '',$text);
  • (?sm): DOTALL (s) MULTILINE (m)
  • (?<=\n): mendahului baris baru (bukan bagian dari pertandingan)
  • \s*&nbsp;\s*: tunggal & nbsp; dengan spasi putih opsional
  • (?=\n): trailing newline (bukan bagian dari pertandingan)
>>> $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
sumber
0

Anda dapat memecah menjadi beberapa baris kemudian menggantikan &nbsp;string kosong pada baris yang hanya berisi a &nbsp;dan spasi.

Kami akan menyimpan ujung garis aslinya, dengan menangkapnya.

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

Keluaran:

string(40) "
   hello&nbsp;world

   &nbsp;hello
"
Progrock
sumber