web-dev-qa-db-ja.com

空白を分解およびトリミングするにはどうすればよいですか?

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

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

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

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

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

133
SeanWM

array_map を使用して以下を実行できます。

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

改善された答え

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

結果:

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

この

  • コンマのみで分割
  • 各アイテムから空白を削除します。
  • 空のアイテムを無視します
  • 「グリーンなもの」のような内部スペースでアイテムを分割しません
45
Amr ElAdawy

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

$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);
23
Diego Perini

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

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

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

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

その背後にある理由は、文字列の末尾にカンマがある場合、配列内の空白要素を返す this answer でバグを見つけたことです。つまり.

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
shmurf

これを試して:

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

具体的にはOPのサンプル文字列の。一致する各部分文字列は単一のWordであるため、 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
mickmackusa

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

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

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