文字列内から余分な空白を削除します


132

データベースクエリから文字列を受け取り、CSVファイルに入れる前に、すべてのHTMLタグ、改行、および改行を削除します。唯一のことは、私は削除する方法を見つけることができません文字列間の余分な空白です。

内部の空白文字を削除する最善の方法は何でしょうか?


6
元の文字列と希望の文字列のサンプルを投稿してください。
Zote、2009年

また、最終的な出力がどのようになる必要があるかを明確にできますか?CSVのデータにコンマを挿入しますか、すでにコンマが含まれているデータベースから取得しますか、CSV挿入を処理する関数に文字列をフィードしますか?
フランクDeRosa

了解です。最終的な出力は、各単語が単一の空白で区切られた文字列である必要があります。現時点では、複数の空白です。
joepour

1
@ジョー、私は時間を無駄にしないで、以前にあなたを助けたすべての人に信用を与え始めます!:)
フランキー

回答:


286

あなたが何を望んでいるか正確にはわかりませんが、ここに2つの状況があります:

  1. あなただけの過剰を扱っている場合はwhitespace、文字列の先頭や末尾にあなたが使用することができtrim()ltrim()またはrtrim()それを削除します。

  2. 文字列内の余分なスペースを処理する場合は、1つのでpreg_replace複数のwhitespaces " "*を検討してwhitespace " "ください。

例:

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

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

を使用する$foo = preg_replace( '/\s+/', ' ', $foo );と、次の効果がnl2br()
失われます

1
preg_replaceを使用する前にnl2brを使用するだけで十分です。
Lukas Liesis 14

タイポ/エスケープの注意-コードが余分な空白を削除しない場合-"s"の前に "\"があることを確認してください:)一部のonline-php-testingページで削除されます:)
jave.web

これはCSSで安全なはずですよね?のように、これは長い複数行のCSS文字列を保持する変数を安全に圧縮しますか?
デビッド

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

または、アンダースコア、 に置き換えます。などなど


7
これにより、すべての空白が削除されます。彼は文字列を正規化したいだけです。
Svend、2010

12
私が探していたもの(問題ではなかったのに)
セブンアース

@ギガラ「内部の空白文字を削除する最良の方法は何ですか?」問題でした。この答えはそれを完全に満たします。
Cory Dee

1
@CoryDe​​e最後の1文についてはそうです。しかし、序論では、質問は「過剰な空白」として表現され、過剰を強調しています。結局、OPの実際の問題を満足させることができたので、それほど問題ではありませんが、それについて技術的になっている限りは...
Spencer Ruskin

これは、仕事があればしないスペースがある偶数、言ってみましょう:Hi Earth4とスペースの間でになるだろう:HiEarth。これは質問に関連する問題を解決しません。
JJ Labajo、

26

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

上記のコード行は、余分なスペースと、先頭と末尾のスペースを削除します。


25

他の例はどれもうまくいかなかったので、これを使用しました:

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

これにより、すべてのタブ、改行、二重スペースなどが単純な1つのスペースに置き換えられます。


@ wp78deに感謝しますが、何らかの理由でだけで問題が発生しました\s+。それは2014年に戻ったので変更されている可能性がありますが、変更されている可能性があります。過去3年間PHPに触れていないため、コメントはできませんが、解決策である間は現在の回答を残し、場合によってはそれが続く可能性があります。
Lukas Liesis、2018年

9

あなたは、たとえば、文字列内にのみ複数のスペースを置き換えたい場合は:"this string have lots of space . " そして、あなたは答えがあることを期待し "this string have lots of space"、あなたは以下のソリューションを使用することができます。

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

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

echo $strng;

5

ユーザー入力[または他の信頼できないソース]からペイロードを取得する場合、preg_replace()の使用にはセキュリティ上の欠陥があります。PHPはeval()で正規表現を実行します。着信文字列が適切にサニタイズされていない場合、アプリケーションがコードインジェクションの危険にさらされます

私のアプリケーションでは、入力のサニタイズを煩わせるのではなく(短い文字列のみを扱うため)、代わりに、プロセッサを集中的に使用する関数を作成しました。

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

'e'修飾子を指定した場合にのみevalを使用して実行します:php.net/manual/en/…また、「この機能はPHP 5.5.0で廃止され、PHP 7.0.0で削除されました。 」そのため、preg_replaceの内容を評価することはできなくなりました。
ADJenks


2

以下を使用できます。

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

これにより、文字列の両側から余分な空白が削除され、文字列内の2つのスペースが1つに変換されます。これは、連続する3つ以上のスペースを1つに変換しないことに注意してください!私が提案できる別の方法は、安全ですが完全に最適ではない爆破と爆破を使用することです!

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

私の提案は、ネイティブのforループを使用するか、この種の仕事をするために正規表現を使用することです。


これは、スペースが2つのスペースより長い場合、複数のスペースを正しく変換しません。
mikeybeck

1

Sandipの答えを拡張するために、bit.lyで誤ってコーディングされたログに一連の文字列が表示されました。URLだけをコーディングするつもりでしたが、スペースの後にTwitterハンドルなどを配置しました。こんな感じ

? productID =26%20via%20@LFS

通常、それは問題にはなりませんが、SQLインジェクションが何度も試行されるので、有効なIDでないものはすべて404にリダイレクトします。preg_replaceメソッドを使用して、無効なproductID文字列を有効な製品ID。

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

URLでスペースを探して、その後のすべてを削除します。


0

最近、正規表現なしで文字列から余分な空白を削除する簡単な関数を書きました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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.