私はこのような文字列を持っています:
「レッド ブルー グリーン ダーク グレー パープル」
そして、私は出力する関数が欲しい:
「赤、青、緑、ダークグレー、紫」
大文字の最初の文字が隣り合っている単語を1つのタグとして、3、4、5 ... 単語が隣り合って大文字になっているのと同じことをしたい。
もう一つの例:
「レモン オレンジ アップル おいしいブラック ベリー」 ==> 「レモン、オレンジ、リンゴ、おいしいブラック ベリー」
私はこのような文字列を持っています:
「レッド ブルー グリーン ダーク グレー パープル」
そして、私は出力する関数が欲しい:
「赤、青、緑、ダークグレー、紫」
大文字の最初の文字が隣り合っている単語を1つのタグとして、3、4、5 ... 単語が隣り合って大文字になっているのと同じことをしたい。
もう一つの例:
「レモン オレンジ アップル おいしいブラック ベリー」 ==> 「レモン、オレンジ、リンゴ、おいしいブラック ベリー」
ええ、それは悪い質問ですが、それは私にとって良い挑戦のように思えました。この正規表現を使用できます。
/(([A-Z][a-z]* ?)+?(?= |$))|([a-z]+)/
そしてPHPコード:
$string = 'red blue green Dark Grey purple';
preg_match_all('/(([A-Z][a-z]* ?)+?(?= |$))|([a-z]+)/', $string, $ans);
print_r($ans[0]); /* Array
* (
* [0] => red
* [1] => blue
* [2] => green
* [3] => Dark Grey
* [4] => purple
* )
*/
$string = 'lemon orange apple Delicious Black Berry';
preg_match_all('/(([A-Z][a-z]* ?)+?(?= |$))|([a-z]+)/', $string, $ans);
print_r($ans[0]); /* Array
* (
* [0] => lemon
* [1] => orange
* [2] => apple
* [3] => Delicious Black Berry
* )
*/
正規表現の説明。これは2つの部分に分かれています。大文字で始まる単語を探す(([A-Z][a-z]* ?)+?(?= |$))
部分と小文字の単語を探す部分([a-z]+)
。そこで、大文字の部分から2つに分けて説明します。
(([A-Z][a-z]* ?)+?(?= |$)) Explanation
([A-Z][a-z]* ?)+?
-([大文字に一致] [0個以上の小文字が続く](スペースまたは何も続かない)少なくとも1回、ただしパターンに一致する可能性のある最小量(?= |$)
-(一致しませんが、次の文字がスペースまたは文字列の終わりであることを確認してください)一致するものがない場合は、次のことを試みます。
([a-z]+) Explanation
([a-z]+)
-[少なくとも1つの小文字にできるだけ多く一致します]楽しみ。:)