複数の空白を削除する


208

私は$row['message']MySQLデータベースから取得しており、同様にすべての空白を削除する必要があります\n \t

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

次のようにフォーマットする必要があります:

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

私は試した:

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

しかし、それは削除されません\n\t、1つだけのスペースを。誰か私にそれを行う方法を教えてもらえますか?


1
改行文字とタブ文字は一重引用符で囲まれているので、リテラルにしますか?
Mark Lalor、2010

\ nと\ tを使用してコードのセクチンの引用を修正し、二重引用符に変更しました。
Buttle Butkus 2013

回答:


394

必要なもの:

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

あなたが使用し\s\s+ているのは、空白(スペース、タブ、または改行)の後に1つ以上の空白が続くことです。つまり、2つ以上の空白を1つのスペースに置き換えるということです。

必要なのは、1つ以上の空白を単一の空白で置き換えることです。そのため、パターン\s\s*または\s+(推奨)を使用できます。


1
彼の方法はこれより優れています:なぜ1つのスペースを1つのスペースに置き換えるのですか?
nickf 2010

16
また、\ nと\ tをスペースに置き換えたいと考えています。ここで、彼のパターンはこれらに一致しません。たとえば、$ x = "does \ nthis \ twork"; OPは、すべての空白を単一のスペースに置き換えたいと考えています。
codaddict

@codaddict、どのようにして\ nを維持し、文字列から他のすべての複数のスペースとタブを削除することができますか?助けてください
Mansoorkhan Cherupuzha

「\ s +」が推奨される理由を具体的に教えてください。
Isius 2013年

6
PHP \sでは「垂直タブ」が含まれていないことに注意してくださいchr(11)。これも含めるには、space文字クラスを使用する必要があります[[:space:]]+ 。php.net
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";
?>

この出力

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

3
あなたは真の命の恩人です。これ以上の窓があれば飛び出そうとしていました。
bikey77 2014年

きちんとした、それでも役立つ
spekulatius

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

\s にはすでにタブと改行が含まれているため、上記の正規表現で十分です。


2
角括弧は内部に1つしかないため、ここでは必要ありません。/m何があるような効果を持っていない習慣^$アンカーがして/u、入力文字列が有効なUTF-8でない場合は、わずかに、ダイそれを遅くする以外に何の効果もありません(それがどのような影響を与えません\s一致しますが、それが影響を与えます\pZ)。
thomasrutter 2016年

12

1つの関数に簡略化:

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の回答に基づいています。


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

2
これは私にとって最もうまくいったものです。また、トリムを追加して、文字列の最初と最後の空白を消去します
Dziamid

あなたはトリム(にpreg_replace(...))でそれを行うことができます@Dziamid
バラージュ・ヴァルガ

7

ここでは問題を再現できません:

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

それが単なる転記エラーだったかどうかはわかりませんが、例では、単一引用符で囲まれた文字列を使用しています。\nそして\tあなたは、二重引用符で囲まれた文字列を持っている場合のみ、改行やタブとして扱われます。あれは:

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

編集:Codaddictが指摘したように\s\s+、単一のタブ文字を置き換えません。私はまだ使用すること\s+は効率的な解決策だとは思わないので、代わりにこれはどうですか:

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

2
+1、正しい。単一のスペースがたくさんある文字列の場合(通常そうです)、スペースをスペースに置き換えるのは非効率的です。
codaddict 2010

1
@coaddict:あなたの仮説をテストするために、私は簡単なスクリプトを書いて、それぞれの交換を1000回実行し、それぞれのタイミングをチェックしました。文字列'+ 1、Trueの場合。単一のスペースがたくさんある文字列の場合(通常そうです)、スペースをスペースに置き換えるのは非効率的です。– codaddict Feb 24 \ '10 at 13:32 '、1,000回の\ s + preg_replace()呼び出しには0.010547876358032秒、1,000回(?:\ s \ s + | \ n | \ t) preg_replace()呼び出しには0.013049125671387、ほぼ30%遅くなります。
Joseph Cheek

一部のコンピューターは単一の「\ r」を単独で使用しているため(Apple Mac?)
thomasrutter

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

これにより、すべてのタブ、すべての改行、および複数のスペース、タブ、改行のすべての組み合わせが1つのスペースに置き換えられます。


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

静的関数remove_whitespaceはどのような理由でですか?あなたはそれを定義しますが、決して使用しません。
Lukas Liesis、2015年

これらにはそれぞれ用途がありますが、これらのどれも、複数の連続する空白を1つだけに置き換えるという質問で求められていることを達成しません。"remove_doublewhitespace"は、同じ空白文字の複数を置き換えるだけなので、 "\ n \ n \ n"を ''に置き換えますが "\ r \ n"には何もしません
thomasrutter

4

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;

2

私はこのコードとパターンを使用します:

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;

これはhttp://writecodeonline.com/php/でテストできます


mariaDBでもこのクエリで動作します。SELECT search_able, REGEXP_REPLACE (search_able,"\\s+",' ') FROM book where id =260 ありがとうございます
jalmatari

1

次のように実行するだけです。

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

これは私が使うものです:

a。必ず二重引用符を使用してください。例:

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

b。余分な空白を削除するには、次を使用します。

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

それは最速の解決策ではないかもしれませんが、私はそれが最小限のコードを必要とするだろうと思います、そしてそれはうまくいくはずです。しかし、私はmysqlを使用したことがないので、間違っている可能性があります。


1

実は、このようなものが欲しいと思ったら:

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

1

これは複数のタブを単一のタブに置き換えます

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

-2

preg_replaceなしで、ループを利用して。

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

 ?>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.