Hapus beberapa spasi putih

208

Saya mendapatkan $row['message']dari database MySQL dan saya harus menghapus semua spasi putih seperti \n \tdan sebagainya.

$row['message'] = "This is   a Text \n and so on \t     Text text.";

harus diformat ke:

$row['message'] = 'This is a Text and so on Text text.';

Saya mencoba:

 $ro = preg_replace('/\s\s+/', ' ',$row['message']);
 echo $ro;

tetapi tidak menghapus \natau \t, hanya spasi tunggal. Adakah yang bisa memberi tahu saya cara melakukannya?

creativz
sumber
1
Karakter baris dan tab baru dalam tanda kutip tunggal, jadi Anda ingin mereka literal?
Mark Lalor
Saya memperbaiki kutipan dari sekte kode dengan \ n dan \ t dengan mengubahnya menjadi tanda kutip ganda.
Buttle Butkus

Jawaban:

394

Anda membutuhkan:

$ro = preg_replace('/\s+/', ' ',$row['message']);

Anda menggunakan \s\s+yang berarti spasi putih (spasi, tab atau baris baru) diikuti oleh satu atau lebih spasi putih. Yang secara efektif berarti mengganti dua atau lebih spasi putih dengan satu ruang.

Apa yang Anda inginkan adalah mengganti satu atau lebih spasi putih dengan spasi tunggal, sehingga Anda dapat menggunakan pola \s\s*atau \s+(disarankan)

codaddict
sumber
1
metodenya lebih baik dari ini: mengapa Anda mengganti satu ruang dengan satu ruang?
nickf
16
Dia juga ingin \ n dan \ t diganti dengan ruang. Sekarang polanya tidak cocok dengan ini, katakanlah untuk $ x = "tidak \ nini \ twork"; OP ingin semua spasi putih diganti dengan satu ruang.
codaddict
@codaddict, bagaimana kita bisa menjaga \ n dan menghapus semua ruang dan tab lain dari string? tolong bantu saya
Mansoorkhan Cherupuzha
Bisakah Anda lebih spesifik mengapa "\ s +" direkomendasikan?
Isius
6
Perhatikan bahwa dalam PHP \stidak termasuk "tab vertikal" chr(11). Untuk memasukkannya juga, Anda perlu menggunakan spacekelas karakter: [[:space:]]+ php.net/manual/en/regexp.reference.character-classes.php
Yaroslav
68
<?php
$str = "This is  a string       with
spaces, tabs and newlines present";

$stripped = preg_replace(array('/\s{2,}/', '/[\t\n]/'), ' ', $str);

echo $str;
echo "\n---\n";
echo "$stripped";
?>

Ini output

This is  a string   with
spaces, tabs and newlines present
---
This is a string with spaces, tabs and newlines present
Cez
sumber
3
Anda adalah penyelamat sejati. Saya akan melompat keluar jika jendela di atas ini.
bikey77
Rapi, masih membantu
spekulatius
16
preg_replace('/[\s]+/mu', ' ', $var);

\s sudah berisi tab dan baris baru, jadi regex di atas ini tampaknya sudah cukup.

Anonim
sumber
2
Kurung kotak tidak diperlukan di sini karena hanya ada satu hal di dalamnya. Tidak /makan memiliki efek karena tidak ada ^atau $jangkar dan /utidak akan memiliki efek apa pun kecuali memperlambatnya sedikit dan mati jika string input tidak valid UTF-8 (tidak mempengaruhi apa yang \scocok, tetapi itu akan mempengaruhi \pZ).
thomasrutter
12

disederhanakan menjadi satu fungsi:

function removeWhiteSpace($text)
{
    $text = preg_replace('/[\t\n\r\0\x0B]/', '', $text);
    $text = preg_replace('/([\s])\1+/', ' ', $text);
    $text = trim($text);
    return $text;
}

berdasarkan jawaban Danuel O'Neal.

Lukas Liesis
sumber
7
$str='This is   a Text \n and so on Text text.';
print preg_replace("/[[:blank:]]+/"," ",$str);
ghostdog74
sumber
2
Ini yang terbaik untuk saya. Juga, saya akan menambahkan trim untuk menghapus spasi di awal dan akhir string
Dziamid
@Dziamid Anda dapat melakukannya dengan trim (preg_replace (...))
Balázs Varga
7

Saya tidak bisa meniru masalah di sini:

$x = "this    \n \t\t \n    works.";
var_dump(preg_replace('/\s\s+/', ' ', $x));
// string(11) "this works."

Saya tidak yakin apakah itu hanya kesalahan transkripsi atau tidak, tetapi dalam contoh Anda, Anda menggunakan string yang dikutip tunggal. \ndan \thanya diperlakukan sebagai baris dan tab baru jika Anda memiliki string yang dikutip ganda. Itu adalah:

'\n\t' != "\n\t"

Sunting : seperti yang ditunjukkan Codaddict, \s\s+tidak akan mengganti karakter tab tunggal. Saya masih tidak berpikir menggunakan \s+adalah solusi yang efisien, jadi bagaimana dengan ini sebagai gantinya:

preg_replace('/(?:\s\s+|\n|\t)/', ' ', $x);
nickf
sumber
2
+1, Benar. Untuk string dengan banyak ruang tunggal (yang biasanya merupakan kasus) tidak efisien untuk mengganti ruang dengan ruang.
codaddict
1
@coaddict: untuk menguji hipotesis Anda, saya menulis skrip cepat untuk menjalankan hingga 1000 setiap penggantian dan memeriksa waktu masing-masing. Untuk string '+1, Benar. Untuk string dengan banyak ruang tunggal (yang biasanya merupakan kasus) tidak efisien untuk mengganti ruang dengan ruang. - codaddict 24 Feb '10 jam 13:32 ' , seribu panggilan + preg_replace () membutuhkan waktu 0,010547876358032 detik, dan seribu (?: \ S + | \ n | \ t) preg_replace () panggilan butuh 0,013049125671387, membuat hampir 30% lebih lambat.
Joseph Cheek
Anda mungkin ingin menambahkan "\" ke contoh terakhir itu karena beberapa komputer menggunakan "" tunggal sendiri (Apple Mac?)
thomasrutter
4
preg_replace('/(\s\s+|\t|\n)/', ' ', $row['message']);

Ini menggantikan semua tab, semua baris baru dan semua kombinasi beberapa ruang, tab dan baris baru dengan satu ruang.

middus
sumber
4
<?php
#This should help some newbies
# REGEX NOTES FROM DANUEL
# I wrote these functions for my own php framework
# Feel Free to make it better
# If it gets more complicated than this. You need to do more software engineering/logic.
# (.)  // capture any character
# \1   // if it is followed by itself
# +    // one or more

class whitespace{

    static function remove_doublewhitespace($s = null){
           return  $ret = preg_replace('/([\s])\1+/', ' ', $s);
    }

    static function remove_whitespace($s = null){
           return $ret = preg_replace('/[\s]+/', '', $s );
    }

    static function remove_whitespace_feed( $s = null){
           return $ret = preg_replace('/[\t\n\r\0\x0B]/', '', $s);
    }

    static function smart_clean($s = null){
           return $ret = trim( self::remove_doublewhitespace( self::remove_whitespace_feed($s) ) );
    }
}
$string = " Hey   yo, what's \t\n\tthe sc\r\nen\n\tario! \n";
echo whitespace::smart_clean($string);
Danuel O'Neal
sumber
fungsi static remove_whitespace adalah untuk alasan apa? Anda mendefinisikan tetapi tidak pernah menggunakannya.
Lukas Liesis
Masing-masing memiliki penggunaannya tetapi tidak satupun dari ini akan mencapai apa yang ditanyakan oleh pertanyaan yaitu untuk mengganti beberapa spasi putih berturut-turut dengan hanya satu. "Remove_doublewhitespace" Anda hanya akan menggantikan beberapa karakter spasi putih yang sama , jadi itu akan menggantikan "\ n \ n \ n" dengan a '', tetapi tidak akan melakukan apa pun untuk "\ r \ n"
thomasrutter
4

Tanpa preg_replace ()

$str = "This is   a Text \n and so on \t     Text text.";
$str = str_replace(["\r", "\n", "\t"], " ", $str);
while (strpos($str, "  ") !== false)
{
    $str = str_replace("  ", " ", $str);
}
echo $str;
hharek
sumber
2

Saya menggunakan kode dan pola ini:

preg_replace('/\\s+/', ' ',$data)

$data = 'This is   a Text 
   and so on         Text text on multiple lines and with        whitespaces';
$data= preg_replace('/\\s+/', ' ',$data);
echo $data;

Anda dapat menguji ini di http://writecodeonline.com/php/

Catalin T.
sumber
Ia bekerja dengan saya bahkan di mariaDB dalam permintaan ini: SELECT search_able, REGEXP_REPLACE (search_able,"\\s+",' ') FROM book where id =260 Jadi Terima kasih banyak
jalmatari
1

Yang Anda butuhkan adalah menjalankannya sebagai berikut:

echo preg_replace('/\s{2,}/', ' ', "This is   a Text \n and so on \t     Text text."); // This is a Text and so on Text text.
Alex Polo
sumber
1

Inilah yang akan saya gunakan:

Sebuah. Pastikan untuk menggunakan tanda kutip ganda, misalnya:

$row['message'] = "This is   a Text \n and so on \t     Text text.";

b. Untuk menghapus spasi kosong, gunakan:

$ro = preg_replace('/\s+/', ' ', $row['message']); 
echo $ro;

Ini mungkin bukan solusi tercepat, tapi saya pikir itu akan memerlukan kode paling sedikit, dan itu harus bekerja. Saya belum pernah menggunakan mysql, jadi saya mungkin salah.

matsolof
sumber
1

Sebenarnya, jika berpikir bahwa Anda menginginkan sesuatu seperti ini:

preg_replace('/\n+|\t+|\s+/',' ',$string);
BigBlast
sumber
1

ini akan menggantikan banyak tab dengan satu tab

preg_replace("/\s{2,}/", "\t", $string);
Heman G
sumber
-2

Tanpa preg_replace, dengan bantuan loop.

<?php

$str = "This is   a Text \n and so on \t     Text text.";
$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