Birden çok beyaz alanı kaldırma


208

$row['message']Bir MySQL veritabanından alıyorum ve benzeri tüm boşlukları kaldırmam gerekiyor \n \t.

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

şu şekilde biçimlendirilmelidir:

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

Denedim:

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

ama kaldırmaz \nveya \tsadece tek boşluk. Biri bana bunu nasıl yapacağımı söyleyebilir mi?


1
Yeni satır ve sekme karakterleri tek tırnak içinde, bu yüzden değişmez olmasını mı istiyorsunuz?
Mark Lalor

Kod sektininin tırnak işaretini \ n ve \ t ile çift tırnak olarak değiştirerek düzelttim.
Buttle Butkus

Yanıtlar:


394

Gerekenler:

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

Kullandığınız \s\s+bir veya daha fazla Arkasında boşluk hangi araçlar boşluk (boşluk, sekme veya satır). Bu, etkili bir şekilde iki veya daha fazla boşlukun tek bir boşlukla değiştirilmesi anlamına gelir.

İstediğiniz şey, bir veya daha fazla boşluğu tek boşlukla değiştirmektir, böylece deseni \s\s*veya \s+(önerilen)


1
yöntemi bundan daha iyidir: neden bir alanı bir boşlukla değiştiresiniz?
nickf

16
Ayrıca \ n ve \ t 'nin boşlukla değiştirilmesini istiyor. Şimdi onun modeli bunlarla uyuşmuyor, diyelim $ x = "\ nthis \ twork"; OP, tüm boşlukların tek bir boşlukla değiştirilmesini istiyor.
codaddict

@codaddict, dizede nasıl \ n tutabilir ve diğer tüm birden çok alanı ve sekmeleri kaldırabiliriz? lütfen bana yardım et
Mansoorkhan Cherupuzha

"\ S +" neden önerildiğinden daha açık olabilir misiniz?
Isius

6
PHP'de \s"dikey sekme" içermediğini unutmayın chr(11). Bunu da dahil etmek için spacekarakter sınıfını kullanmanız gerekir : [[: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";
?>

Bu çıktılar

This is  a string   with
spaces, tabs and newlines present
---
This is a string with spaces, tabs and newlines present

3
Sen gerçek bir cankurtaransın. Eğer pencerenin üstünden atlamak üzereydim.
bikey77

Temiz, hala yardımsever
spekulatius

16
preg_replace('/[\s]+/mu', ' ', $var);

\s zaten sekmeler ve yeni satırlar içeriyor, bu nedenle yukarıdaki normal ifade yeterli görünüyor.


2
Burada köşeli parantezlere gerek yoktur çünkü içinde sadece bir şey vardır. /mHiçbir olduğu gibi bir etkiye sahip olmaz ^veya $çapalar ve /ugirdi dizesi değilse hafifçe yavaşlatmak ve ölmek dışında herhangi bir etkisi olmayacaktır geçerli UTF-8 (ne etkilemez \smaçları, ancak etkileyecek \pZ).
thomasrutter

12

bir işleve basitleştirilmiş:

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

Danuel O'Neal cevabına dayanarak.


7
$str='This is   a Text \n and so on Text text.';
print preg_replace("/[[:blank:]]+/"," ",$str);

2
Bu benim için en iyi olanı. Ayrıca, dizenin başında ve sonunda boşluk silmek için trim
eklerdim

@Dziamid Trim ile yapabilirsiniz (preg_replace (...))
Balázs Varga

7

Sorunu burada çoğaltamıyorum:

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

Sadece bir transkripsiyon hatası olup olmadığından emin değilim, ancak örneğinizde tek tırnaklı bir dize kullanıyorsunuz. \nve \tyalnızca çift tırnaklı bir dizeniz varsa yeni satır ve sekme olarak değerlendirilir. Yani:

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

Düzenleme : Codaddict'in işaret ettiği gibi, \s\s+tek bir sekme karakterinin yerini almayacak. Yine de kullanarak \s+etkili bir çözüm olduğunu düşünmüyorum , bu yüzden bunun yerine:

preg_replace('/(?:\s\s+|\n|\t)/', ' ', $x);

2
+1, Doğru. Çok sayıda tek boşluklu bir dize için (genellikle durum böyle) bir boşluğu boşlukla değiştirmek yetersizdir.
codaddict

1
@coaddict: hipotezinizi test etmek için, her bir yedeklemenin 1000'inden geçmek ve her birinin zamanlamasını kontrol etmek için hızlı bir komut dosyası yazdım. '+1, True dizesi için . Çok sayıda tek boşluklu bir dize için (genellikle durum böyle) bir boşluğu boşlukla değiştirmek yetersizdir. - codaddict 24 Şubat \ '10, 13:32 ' , bin \ s + preg_replace () çağrıları 0.010547876358032 saniye ve bin (?: \ S \ s + | \ n | \ t) preg_replace () çağrıları 0.013049125671387 aldı neredeyse% 30 daha yavaş.
Joseph Cheek

Bazı bilgisayarlar kendi başına tek bir "\ r" kullandığından bu son örneğe "\ r" eklemek isteyebilirsiniz (Apple Mac?)
thomasrutter

4
preg_replace('/(\s\s+|\t|\n)/', ' ', $row['message']);

Bu, tüm sekmeleri, tüm yeni satırları ve birden çok boşluk, sekme ve yeni satırın tüm kombinasyonlarını tek bir boşlukla değiştirir.


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

statik fonksiyonu remove_whitespace hangi nedenle? Siz tanımlarsınız ama asla kullanmazsınız.
Lukas Liesis

Bunların her birinin kullanımı vardır, ancak bunların hiçbiri, sorunun üst üste geldiği, birden fazla ardışık boşluğu sadece biriyle değiştirmektir. "Remove_doublewhitespace" öğeniz yalnızca aynı boşluk karakterinin çoğunu değiştirir , bu nedenle "\ n \ n \ n" yerine "" yazar, ancak "\ r \ n" için hiçbir şey yapmaz
thomasrutter

4

Preg_replace () olmadan

$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;

2

Bu kod ve desen kullanın:

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;

Bunu http://writecodeonline.com/php/ adresinde test edebilirsiniz.


Bu sorguda mariaDB'de bile benimle çalışıyor: SELECT search_able, REGEXP_REPLACE (search_able,"\\s+",' ') FROM book where id =260 Çok teşekkürler
jalmatari

1

Tek ihtiyacınız olan aşağıdaki gibi çalıştırmaktır:

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.

1

Ne kullanacağımı:

a. Çift tırnak kullandığınızdan emin olun, örneğin:

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

b. Fazla boşluk kaldırmak için şunu kullanın:

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

En hızlı çözüm olmayabilir, ancak en az kod gerektireceğini düşünüyorum ve çalışması gerekir. Asla mysql kullanmadım, bu yüzden yanlış olabilirim.


1

Gerçekte, böyle bir şey istediğinizi düşünüyorsanız:

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

1

bu, birden çok sekmeyi tek bir sekme ile değiştirir

preg_replace("/\s{2,}/", "\t", $string);

-2

Preg_replace olmadan, döngü yardımı ile.

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

 ?>
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.