空白を分解して削除するにはどうすればよいですか?


167

たとえば、次の文字列の要素から配列を作成したいとします。

$str = 'red,     green,     blue ,orange';

私はあなたが爆発してそれらをループしてトリムできることを知っています:

$arr = explode(',', $str);
foreach ($arr as $value) {
    $new_arr[] = trim($value);
}

しかし、これを処理できる1行のアプローチがあるように感じます。何か案は?

回答:


449

array_mapを使用すると、次のことができます。

$new_arr = array_map('trim', explode(',', $str));

10
これもPHPによって(内部で)ループしています
Jason OOO

2
this .... saved .... my ... life .... fseekを使用してファイルを操作し、ファイルの最後に追加しようとしていました...配列に分割して書き換えることにした後ファイル、私はずっと余分な空白が追加されているのを見ました...これ+内破は私のおかしな命を救いました..私は今食べ物を食べに行くことができます。
jenki221

4
@JasonOOOほとんどの人の意見では、数ミリ秒(それでも)は、短くてシンプルで読みやすいコード行を使用することの公平なトレードオフだと思います。
Gavin

シンプルでわかりやすい。ただし、大規模なデータセットを処理する場合は、@ amr-eladwyによって提供されるパフォーマンスの高い回答がより良いソリューションです。
Yaron、2018年

私はこのコードが大好きで、時々このサイトに戻ってきます!
patrickzzz

52

改善された答え

preg_split ('/(\s*,*\s*)*,+(\s*,*\s*)*/', 'red,     green thing ,,  ,,   blue ,orange');

結果:

Array
(
    [0] => red
    [1] => green thing
    [2] => blue
    [3] => orange
)

この

  • カンマのみで分割
  • 各アイテムから空白を削除します。
  • 空のアイテムを無視します
  • 「緑のモノ」のような内部スペースのあるアイテムは分割しません

7
この回答に100の賛成票がない理由を誰かが私に説明できますか?Regexpは理解しにくいですが、他のソリューションよりも速く100Mbファイルを解析しました
Dan

2
お役に立てて嬉しいです。私はすべての答えを読み、より良いミックスで来ました。正規表現は詳細に説明できます。
Amr ElAdawy

2
申し訳ありませんが、この正規表現は間違っています-に置き換えredてみてください*red*。/(\ s *、\ s *)+ /
Greg

@AmrElAdawy FYIこれは、8/28更新後に機能しなくなります。答えの正規表現をそのまま使用すると、一部の要素から空白が削除されません。例: `緑のもの`。
Samsquanch

1
@Samsquanchが更新されました。問題が発生した場合はお知らせください。
AmAd ElAdawy

25

以下は、入力文字列の開始/終了時の空白も処理します。

$new_arr = preg_split('/\s*,\s*/', trim($str));

そして、これはすべての賢明な位置に空白がある最小のテストです:

$str = ' first , second , third , fourth, fifth ';
$new_arr = preg_split('/\s*,\s*/', trim($str));
var_export($str);

array_mapと正規表現ソリューションは同じ結果を生成するので、誰かがそのパフォーマンスを比較できますか?
Dan

@Danこのような場合、違いはありません。
アリス

4

これは、1行のコードで置換および爆発する方法です。

$str = 'red,     green,     blue ,orange';

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

結果は次のように出力されます

Array
(
    [0] => red
    [1] => green
    [2] => blue
    [3] => orange
)

3

私が思いついた既存の回答にいくつかのプリンシパルを組み合わせることで

preg_split ('/\s*,+\s*/', 'red,     green thing ,,  ,,   blue ,orange', NULL, PREG_SPLIT_NO_EMPTY);

その背後にある理由は、この回答にバグを見つけたことです。文字列の末尾にコンマがあると、配列内に空白の要素が返されます。すなわち

preg_split ('/(\s*,*\s*)*,+(\s*,*\s*)*/', 'red,     green thing ,,  ,,   blue ,orange,');

結果

Array
(
  [0] => red
  [1] => green thing
  [2] => blue
  [3] => orange
  [4] => ''
)

これを修正するには、この回答で述べたようにPREG_SPLIT_NO_EMPTYを使用してこれを削除しますが、一度実行すると、技術的には正規表現を介して連続するコンマを削除する必要がないため、短縮された式


2

これを1行の正規表現で行うこともできます

preg_split('@(?:\s*,\s*|^\s*|\s*$)@', $str, NULL, PREG_SPLIT_NO_EMPTY);

1

これを試して:

$str = preg_replace("/\s*,\s*/", ",", 'red,     green,     blue ,orange');

OPは配列を必要としています。 preg_replace()文字列から配列を生成しません。これは間違った質問に対する正しい答えです。反対投票。
mickmackusa 2017

1
$list = preg_split("/\s*,\s*/", 'red, green, blue ,orange');マイナーな修正により回答がリハビリ
dreftymac

1

特異的に OPのサンプル文字列のため、各サブストリングが一致するので、単一の言葉では、使用することができます)(str_word_countを

コード:(デモ

$str = ' red,     green,     blue ,orange ';
var_export(str_word_count($str,1));  // 1 means return all words in an indexed array

出力:

array (
  0 => 'red',
  1 => 'green',
  2 => 'blue',
  3 => 'orange',
)

これは、文字マスク/ 3番目のパラメーターに必要な文字を追加することにより、文字(および一部のハイフンとアポストロフィ-細字を読む場合)を超えた部分文字列にも適応できます。

コード:(デモ

$str = " , Number1 ,     234,     0 ,4heaven's-sake  ,  ";
var_export(str_word_count($str,1,'0..9'));

出力:

array (
  0 => 'Number1',
  1 => '234',
  2 => '0',
  3 => '4heaven\'s-sake',
)

繰り返しますが、サンプル文字列のため、この質問は非常に狭く扱っていますが、これにより同じ望ましい出力が得られます。

コード:(デモ

$str = ' red,     green,     blue ,orange ';
var_export(preg_match_all('/[^, ]+/',$str,$out)?$out[0]:'fail');

0

そのためにpreg_split()を使用できます。

$bar = preg_split ('/[,\s]+/', $str);
print_r ($bar);

/* Result:
  Array
  (
      [0] => red
      [1] => green
      [2] => blue
      [3] => orange
  )
 */

要素のスペースで分割されます
Chris KL

コンマを角かっこの左側に移動して、必要なコンマにします。
Eric Leschinski、2014

カンマを左に移動しても解決しません。下に私の答えを確認してくださいstackoverflow.com/a/38300330/5079380
アムルElAdawy


-11

トリミングして爆発

$ str = '赤、緑、青、オレンジ';

$ str = trim($ str);

$ strArray = explode( '、'、$ str);

print_r($ strArray);


5
これは、各色の間ではなく、文字列の最初と最後から空白を取り除きます。
SeanWM 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.