たとえば、この文字列の要素から配列を作成したいと思います。
$str = 'red, green, blue ,orange';
私はあなたがそれらを爆発させてループし、トリムできることを知っています:
$arr = explode(',', $str);
foreach ($arr as $value) {
$new_arr[] = trim($value);
}
しかし、これを処理できる1行のアプローチがあるように感じます。何か案は?
array_map を使用して以下を実行できます。
$new_arr = array_map('trim', explode(',', $str));
改善された答え
preg_split ('/(\s*,*\s*)*,+(\s*,*\s*)*/', 'red, green thing ,, ,, blue ,orange');
結果:
Array
(
[0] => red
[1] => green thing
[2] => blue
[3] => orange
)
この
次は、入力文字列の開始/終了の空白も処理します。
$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);
また、1行の正規表現でこれを行うことができます
preg_split('@(?:\s*,\s*|^\s*|\s*$)@', $str, NULL, PREG_SPLIT_NO_EMPTY);
私が思いついた既存の答えのプリンシパルのいくつかを組み合わせることで
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を使用して この回答 で説明したように削除しますが、それを行うと技術的に問題が発生します正規表現を介して連続するコンマを削除する必要がないため、短縮式
これを試して:
$str = preg_replace("/\s*,\s*/", ",", 'red, green, blue ,orange');
具体的には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');
そのために preg_split() を使用できます。
$bar = preg_split ('/[,\s]+/', $str);
print_r ($bar);
/* Result:
Array
(
[0] => red
[1] => green
[2] => blue
[3] => orange
)
*/