web-dev-qa-db-ja.com

複数の空白を削除する

MySQLデータベースから$row['message']を取得しています。\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つだけ削除されます。誰もそれを行う方法を教えてもらえますか?

187
creativz

必要なもの:

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

\s\s+を使用しています。これは、空白(スペース、タブ、または改行)の後に1つ以上の空白が続くことを意味します。これは、2つ以上の空白を単一のスペースに置き換えることを効果的に意味します。

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

358
codaddict
<?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
62
Cez
preg_replace('/[\s]+/mu', ' ', $var);

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

11
Anonymous

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

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

ここで問題を再現することはできません。

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

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;
4
hharek
preg_replace('/(\s\s+|\t|\n)/', ' ', $row['message']);

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

4
middus
<?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);
3
Danuel O'Neal

これは私が使用するものです:

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
matsolof

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

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
Alex Polo

これにより、複数のタブが単一のタブに置き換えられます

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

真実で、あなたがこのような何かが欲しいと思うなら:

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

このコードとパターンを使用します。

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/ でテストできます

0
Catalin T.