Hapus spasi kosong dari dalam string

132

Saya menerima string dari kueri basis data, lalu saya menghapus semua tag HTML, carriage return, dan baris baru sebelum saya memasukkannya ke file CSV. Satu-satunya hal adalah, saya tidak dapat menemukan cara untuk menghilangkan kelebihan ruang putih dari antara string.

Apa yang akan menjadi cara terbaik untuk menghapus karakter spasi putih?

joepour
sumber
6
Tolong, kirim sampel string asli dan string yang diinginkan.
Zote
Bisakah Anda juga menjelaskan bagaimana hasil akhir perlu? Apakah Anda memasukkan koma ke dalam data untuk CSV, mendapatkannya dari database dengan koma yang sudah ada di dalamnya, memasukkan string ke fungsi yang menangani penyisipan CSV, dll?
Frank DeRosa
ok put out terakhir harus berupa string dengan setiap kata dipisahkan oleh spasi tunggal, pada saat itu adalah beberapa spasi putih.
joepour
1
@ Jo, saya tidak akan membuang waktu dan akan mulai memberikan penghargaan kepada semua orang yang telah membantu Anda sebelumnya! :)
Frankie

Jawaban:

286

Tidak yakin persis apa yang Anda inginkan tetapi di sini ada dua situasi:

  1. Jika Anda hanya berurusan dengan kelebihan whitespacepada awal atau akhir string yang dapat Anda gunakan trim(), ltrim()atau rtrim()untuk menghapusnya.

  2. Jika Anda berhadapan dengan ruang ekstra dalam sebuah string, pertimbangkan a preg_replacedari banyak whitespaces " "*dengan satu whitespace " ".

Contoh:

$foo = preg_replace('/\s+/', ' ', $foo);
jW.
sumber
62
$ foo = preg_replace ('/ \ s + /', '', $ foo);
genio
menggunakan $foo = preg_replace( '/\s+/', ' ', $foo );akan membunuh efeknl2br()
Waiyl Karim
1
cukup gunakan nl2br sebelum menggunakan preg_replace dan Anda harus baik-baik saja.
Lukas Liesis
Catatan Typo / Escaper - jika kode tidak menghapus spasi tambahan untuk Anda - pastikan Anda memiliki "\" sebelum "s" :) beberapa halaman pengujian php online menghapusnya :)
jave.web
Ini harus CSS yang aman, bukan? Seperti pada, ini akan dengan aman memampatkan variabel yang memegang string CSS multi-line yang panjang?
David
50
$str = str_replace(' ','',$str);

Atau, ganti dengan garis bawah, & nbsp; dll.

Cory Dee
sumber
7
Ini menghapus semua spasi putih. Dia hanya ingin menormalkan string.
Svend
12
Apa yang saya cari (walaupun itu bukan pertanyaannya)
Sevenearths
@Gigala "Apa cara terbaik untuk menghapus karakter spasi putih?" adalah pertanyaannya. Jawaban ini memuaskan itu dengan sempurna.
Cory Dee
1
@CoryDee Itu benar, untuk satu kalimat terakhir. Tapi dalam pendahuluan, pertanyaannya adalah diungkapkan sebagai " kelebihan spasi", dengan penekanan pada kelebihannya. Anda akhirnya memuaskan masalah OPUAL ACTUAL, jadi itu tidak masalah, tapi selama kita mendapatkan teknis tentang hal itu ...
Spencer Ruskin
Ini tidak bekerja jika jumlah dari ruang adalah jumlah yang lebih , mari katakanlah: Hi Earthdengan 4 spasi di antara akan menjadi: HiEarth. Ini tidak menyelesaikan masalah saya dengan pertanyaan yang relevan.
JJ Labajo
26

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

Baris kode di atas akan menghapus spasi tambahan , serta spasi awal dan akhir.

d -_- b
sumber
25

tidak ada contoh lain yang berfungsi untuk saya, jadi saya telah menggunakan yang ini:

trim(preg_replace('/[\t\n\r\s]+/', ' ', $text_to_clean_up))

ini menggantikan semua tab, baris baru, spasi ganda dll menjadi 1 ruang sederhana.

Lukas Liesis
sumber
Terima kasih, @ wp78de tetapi untuk alasan apa pun, saya punya masalah dengan adil \s+. Meskipun sudah kembali pada tahun 2014 jadi mungkin itu diubah, belum menyentuh PHP selama 3 tahun terakhir, tidak dapat berkomentar tetapi akan meninggalkan jawaban saat ini sementara itu adalah solusi dan mungkin masih dalam beberapa kasus.
Lukas Liesis
9

Jika Anda ingin mengganti hanya beberapa spasi dalam string, misalnya: "this string have lots of space . " Dan Anda mengharapkan jawabannya "this string have lots of space", Anda dapat menggunakan solusi berikut:

$strng = "this string                        have lots of                        space  .   ";

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

echo $strng;
Apsar
sumber
5

Ada kelemahan keamanan untuk menggunakan preg_replace (), jika Anda mendapatkan payload dari input pengguna [atau sumber tidak tepercaya lainnya]. PHP mengeksekusi ekspresi reguler dengan eval (). Jika string yang masuk tidak dibersihkan dengan benar, aplikasi Anda berisiko terkena injeksi kode .

Dalam aplikasi saya sendiri, daripada repot-repot membersihkan input (dan karena saya hanya berurusan dengan string pendek), saya malah membuat fungsi prosesor yang sedikit lebih intensif, meskipun yang aman, karena tidak eval () apa pun.

function secureRip(string $str): string { /* Rips all whitespace securely. */
  $arr = str_split($str, 1);
  $retStr = '';
  foreach ($arr as $char) {
    $retStr .= trim($char);
  }
  return $retStr;
}
Fom
sumber
Ini hanya mengeksekusi menggunakan eval jika Anda menentukan 'e' modifierser: php.net/manual/en/… itu juga mengatakan bahwa "Fitur ini DIPERKIRAKAN dalam PHP 5.5.0, dan DIHAPUS pada PHP 7.0.0. " Jadi, Anda tidak dapat mengevaluasi hal-hal di preg_replace lagi.
ADJenks
4
$str = preg_replace('/[\s]+/', ' ', $str);
Sandip Layek
sumber
2

Kamu bisa memakai:

$str = trim(str_replace("  ", " ", $str));

Ini menghilangkan spasi putih tambahan dari kedua sisi string dan mengubah dua spasi menjadi satu di dalam string. Perhatikan bahwa ini tidak akan mengubah tiga ruang atau lebih berturut-turut menjadi satu! Cara lain yang bisa saya sarankan adalah menggunakan implode dan meledak yang lebih aman tetapi sama sekali tidak optimal!

$str = implode(" ", array_filter(explode(" ", $str)));

Saran saya adalah menggunakan asli untuk loop atau menggunakan regex untuk melakukan pekerjaan semacam ini.

Amir Fo
sumber
Ini tidak mengkonversi beberapa ruang dengan benar di mana ruang lebih panjang dari dua ruang.
mikeybeck
1

Untuk memperluas jawaban Sandip, saya memiliki banyak string muncul di log yang salah kode dalam bit.ly. Mereka bermaksud hanya kode URL tetapi menempatkan pegangan twitter dan beberapa hal lainnya setelah spasi. Terlihat seperti ini

? productID =26%20via%20@LFS

Biasanya, itu tidak akan menjadi masalah, tapi saya mendapatkan banyak upaya injeksi SQL, jadi saya mengarahkan ulang apa pun yang bukan ID yang valid ke 404. Saya menggunakan metode preg_replace untuk membuat string productID yang tidak valid menjadi sebuah ID produk yang valid.

$productID=preg_replace('/[\s]+.*/','',$productID);

Saya mencari spasi di URL dan kemudian menghapus semuanya setelahnya.

JScarry
sumber
0

Baru-baru ini saya menulis fungsi sederhana yang menghilangkan ruang putih berlebih dari string tanpa ekspresi reguler implode(' ', array_filter(explode(' ', $str))).

Zsolt Oroszlány
sumber
-1
$str = "I      am a PHP   Developer";
$str_length = strlen($str);
$str_arr = str_split($str);
for ($i = 0; $i < $str_length; $i++) {
   if (isset($str_arr[$i + 1])  && $str_arr[$i] == ' ' && $str_arr[$i] == $str_arr[$i + 1]) {
       unset($str_arr[$i]);
   } 
   else {
     continue;
   }
}
echo implode("", $str_arr);
Shahbaz Khan
sumber