私はこれが答えられたことを知っています、しかし、あなたは1つのコマンドでこれをすることができました:
$input = "foo, bar, baz., shibby, poop.";
//-- handles it all in one pass
$output = preg_split('/[\.,\s]/', $input, -1, PREG_SPLIT_NO_EMPTY);
//-- just output
array_walk($output, function(&$item, $idx) {
echo $idx . ': ' . $item . PHP_EOL;
});
ただし、値にスペースを期待している場合は、これによって値も分割されます。\s
要素をトリミングするために正規表現に追加しました。値にスペースが必要な場合は、後で\s
正規表現とtrim()
要素のを省略してください。
または、この正規表現は同じものを生成します:/(\.\s?|,\s?)/
$input = "foo, bar, baz., shibby, poop. foo bar";
//-- handles it all in one pass
$output = preg_split('/(\.\s?|,\s?)/', $input, -1, PREG_SPLIT_NO_EMPTY);
//-- just output
array_walk($output, function(&$item, $idx) {
echo $idx . ': ' . $item . PHP_EOL;
});
生産する
0: foo
1: bar
2: baz
3: shibby
4: poop
5: foo bar
正規表現:説明
元の正規表現は、[
およびで示されるように、文字列内の1文字で単純に分割され]
ます。したがって、/[\.,\s]/
文字列内のピリオド、コンマ、およびスペース文字に一致します。それについて考えた後、これはおそらくあなたが望むものではなく、近いものです。
更新された正規表現は少し異なり、2つの異なるシナリオに分かれています。\.\s?
言う:期間および/またはpreiod+spaceで分割します。は上記?
をオプションにします(私は0または1を信じています)。と同じ,\s?
です。カンマおよび/またはカンマ+スペースで一致します。これはすべてのシナリオを説明します。(...)
文字範囲の代わりにグループ化()を使用すると、これが可能になります。真ん中のパイプ|
はORを意味し、完全な正規表現は次のことを意味します。ピリオドおよび/またはピリオド+スペースORコンマおよび/またはコンマ+スペースで一致します。