用正则表达式。
如果您只打算使用非重音拉丁字符,它可以很简单
$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
. 这匹配任何具有大写等效项(带有 pattern \p{Ll}
)的 unicode 字母,前提是它前面没有任何其他字母(带有 pattern 的负向lookbehind\p{L}
)。然后将其替换为等效的大写字母。
看到它在行动。
更新:看起来您打算仅将空格视为单词边界。这可以通过正则表达式来完成
(?<=\s|^)([a-z])
(?<=\s|^)(\p{Ll})