Bir dizedeki fazla boşlukları kaldırın


133

Bir veritabanı sorgusundan bir dize alıyorum, ardından bir CSV dosyasına koymadan önce tüm HTML etiketlerini, satır başlarını ve yeni satırları kaldırıyorum. Tek sorun, dizeler arasındaki fazla beyaz boşluğu kaldırmanın bir yolunu bulamıyorum .

İç boşluk karakterlerini kaldırmanın en iyi yolu nedir?


6
Lütfen orijinal dizgi ve aranan dizenin bir örneğini gönderin.
Zote

Nihai çıktının nasıl olması gerektiğini de açıklayabilir misin? Virgülleri CSV için verilere ekliyor, virgüllerin bulunduğu bir veritabanından alıyor, dizeleri CSV eklemeyi işleyen bir işleve besliyor, vb.
Frank DeRosa

ok, son çıktı her bir kelimenin tek bir boşlukla ayrılmış bir dizge olması gerekir, şu anda birden fazla boşluk vardır.
joepour

1
@Joe, zaman kaybetmezdim ve daha önce sana yardım eden herkesi takdir etmeye başlardım! :)
Frankie

Yanıtlar:


287

Tam olarak ne istediğinizden emin değilim ama işte iki durum:

  1. Sadece aşırı ilgileniyor varsa whitespacekullanabileceğiniz dizenin başına ya da sonuna trim(), ltrim()ya rtrim()kaldırmak için.

  2. Bir dizgede fazladan boşluklarla uğraşıyorsanız , bir tek ile preg_replacebirden çok sayıda düşünün .whitespaces " "*whitespace " "

Misal:

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

62
$ foo = preg_replace ('/ \ s + /', '', $ foo);
genio

kullanarak $foo = preg_replace( '/\s+/', ' ', $foo );etkilerini öldüreceknl2br()
Waiyl Karim

1
preg_replace'i kullanmadan önce sadece nl2br kullanın ve gitmeniz iyi olur.
Lukas Liesis

Kodu sizin için ekstra boşluğa kaldırmaması halinde - - Tipo / Escaper notu size "s" :) bazı çevrimiçi-php-test sayfaları çıkarmak :) önce "\" sahip olmalarını sağlamak
jave.web

Bu CSS güvenli olmalı, değil mi? İçinde olduğu gibi, bu uzun, çok satırlı bir CSS dizesini tutan bir değişkeni güvenli bir şekilde sıkıştırır mı?
David

50
$str = str_replace(' ','',$str);

Veya alt çizgiyle değiştirin & nbsp; vs vs.


7
Bu, tüm boşlukları kaldırır. Sadece dizeyi normalleştirmek istiyor.
Svend

12
Aradığım şey (soru bu olmasa da)
Sevenearths

@Gigala "İç boşluk karakterlerini kaldırmanın en iyi yolu nedir?" soru buydu. Bu cevap bunu mükemmel şekilde tatmin ediyor.
Cory Dee

1
@CoryDee Bu son tek cümle için doğru. Ancak girişte, soru fazlalığa vurgu yapılarak " fazla boşluk" olarak ifade edilmiştir . Sonunda OP'nin GERÇEK problemini tatmin ettiniz, bu yüzden çok önemli değil, ama bu konuda teknik bilgi sahibi olduğumuz sürece ...
Spencer Ruskin 9'13

Bu takdirde çalışmaz sayımı ait alanlarda ise çift sayı :, söz let Hi Earth4 ile boşluk arasında olacak: HiEarth. Bu, soruyla ilgili sorunumu çözmez.
JJ Labajo

26

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

Yukarıdaki kod satırı, fazladan boşlukların yanı sıra baştaki ve sondaki boşlukları kaldıracaktır .


25

diğer örneklerin hiçbiri benim için işe yaramadı, bu yüzden bunu kullandım:

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

bu, tüm sekmeleri, yeni satırları, çift boşlukları vb. basit 1 boşlukla değiştirir.


Teşekkürler @ wp78de ama herhangi bir nedenle, sadece sorun yaşadım \s+. 2014 yılında geri dönmüş olmasına rağmen, belki değişti, son 3 yıldır PHP'ye dokunmadı, yorum yapamıyorum, ancak bir çözüm iken mevcut cevabı bırakacak ve hala bazı durumlarda olabilir.
Lukas Liesis

9

Bir dizede yalnızca birden çok boşluğu değiştirmek istiyorsanız, örneğin: "this string have lots of space . " Ve cevabın olmasını bekliyorsanız "this string have lots of space", aşağıdaki çözümü kullanabilirsiniz:

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

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

echo $strng;

5

Yükü kullanıcı girdisinden [veya diğer güvenilmeyen kaynaklardan] alırsanız, preg_replace () kullanmanın güvenlik kusurları vardır. PHP, normal ifadeyi eval () ile yürütür. Gelen dizi uygun şekilde temizlenmezse, uygulamanız kod enjeksiyonuna maruz kalma riski taşır .

Kendi uygulamamda, girdiyi sterilize etmek yerine (ve sadece kısa dizelerle uğraştığım için), bunun yerine, hiçbir şeyi değerlendirmediği için () güvenli olsa da, biraz daha fazla işlemci yoğun bir işlev yaptım.

function secureRip(string $str): string { /* Rips all whitespace securely. */
  $arr = str_split($str, 1);
  $retStr = '';
  foreach ($arr as $char) {
    $retStr .= trim($char);
  }
  return $retStr;
}

Yalnızca 'e' değiştiricisini belirtirseniz eval kullanarak yürütür: php.net/manual/en/… Ayrıca, "Bu özellik PHP 5.5.0'da KULLANIMDAN KALDIRILDI ve PHP 7.0.0'dan itibaren KALDIRILDI. " Yani artık preg_replace'deki şeyleri değerlendiremezsiniz.
ADJenks


2

Kullanabilirsiniz:

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

Bu , dizenin her iki tarafındaki fazladan boşlukları kaldırır ve dizede iki boşluğu bir boşluğa dönüştürür . Bunun arka arkaya üç veya daha fazla boşluğu bire dönüştürmeyeceğini unutmayın! Önerebileceğim başka bir yol da implode ve Explode kullanmaktır, bu daha güvenli ancak tamamen optimum değildir!

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

Benim önerim yerel bir for döngüsü kullanmak veya bu tür bir işi yapmak için normal ifade kullanmak.


Bu, alanın iki boşluktan uzun olduğu durumlarda birden fazla alanı doğru şekilde dönüştürmez.
mikeybeck

1

Sandip'in cevabını genişletmek için, bit.ly'de yanlış kodlanmış günlüklerde görünen bir dizi dize vardı. Sadece URL'yi kodlamak istediler, ancak bir boşluktan sonra bir twitter tutamaç ve başka şeyler koydular. Böyle görünüyordu

? productID =26%20via%20@LFS

Normalde bu bir sorun olmaz, ancak çok fazla SQL enjeksiyon denemesi alıyorum, bu yüzden geçerli bir kimlik olmayan herhangi bir şeyi 404'e yönlendiriyorum. Geçersiz productID dizesini bir geçerli ürün kimliği.

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

URL'de bir boşluk arıyorum ve ardından her şeyi kaldırıyorum.


0

Son zamanlarda, fazla beyaz boşluğu düzenli ifade olmadan dizeden kaldıran basit bir işlev yazdım implode(' ', array_filter(explode(' ', $str))).


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