正規表現で。
アクセントのないラテン文字のみを使用する場合は、次のように簡単にできます。
$str = 'he said "hello WORLD"';
echo preg_replace('/\b([a-z])/e', 'strtoupper(\'$1\')', strtolower($str));
これは、単語の境界が前にある小文字のアクセントのないラテン文字と一致します。この文字は、対応する大文字に置き換えられます。
これを他の言語やスクリプトでも動作させたい場合は、工夫する必要があります。
$str = 'he said "καλημέρα ΚΌΣΜΕ"'; // this has to be in UTF-8
echo preg_replace('/(?<!\p{L})(\p{Ll})/eu',
'mb_convert_case(\'$1\', MB_CASE_UPPER, \'UTF-8\')',
mb_convert_case($str, MB_CASE_LOWER, 'UTF-8'));
これを理解するには、PCRE のUnicode機能を参照する必要があります。また、u
修飾子を に追加したことに注意してくださいpreg_replace
。\p{Ll}
これは、他の文字が前にない場合 ( pattern を使用した負の後読み)、大文字に相当する ( pattern を使用した) Unicode 文字に一致します\p{L}
。次に、大文字に相当するものに置き換えます。
実際に見てください。
更新:空白のみを単語の境界と見なすつもりのようです。これは、正規表現で行うことができます
(?<=\s|^)([a-z])
(?<=\s|^)(\p{Ll})