好吧,让我们试着重新创造
mb_convert_case
尽可能接近,但只改变每个单词的第一个字符。
相关部分
mb\U转换\U案例
int mode = 0;
for (i = 0; i < unicode_len; i+=4) {
int res = php_unicode_is_prop(
BE_ARY_TO_UINT32(&unicode_ptr[i]),
UC_MN|UC_ME|UC_CF|UC_LM|UC_SK|UC_LU|UC_LL|UC_LT|UC_PO|UC_OS, 0);
if (mode) {
if (res) {
UINT32_TO_BE_ARY(&unicode_ptr[i],
php_unicode_tolower(BE_ARY_TO_UINT32(&unicode_ptr[i]),
_src_encoding TSRMLS_CC));
} else {
mode = 0;
}
} else {
if (res) {
mode = 1;
UINT32_TO_BE_ARY(&unicode_ptr[i],
php_unicode_totitle(BE_ARY_TO_UINT32(&unicode_ptr[i]),
_src_encoding TSRMLS_CC));
}
}
}
基本上,这会执行以下操作:
-
套
mode
到
0
模式
将决定我们是否在单词的第一个字符中。如果是的话
0
,我们是,否则,我们不是。
-
遍历字符串的字符。
-
确定它是什么样的角色。
-
res
到
1
如果是文字字符。更具体地说,设置为
1
如果它具有属性“Mark,Non-Spacing”,“Mark,Enclosing”,“Other,Format”,“Letter,Modifier”,“Symbol,Modifier”,“Letter,Uppercase”,“Letter,Lowercase”,“Letter,Titlecase”,“标点符号,Other”或“Other,subrogate”。奇怪的是,“信,其他”不包括在内。
-
如果我们不在一个词的开头
-
这是我们不想要的
.
-
否则,我们就不在一个字的字符,我们设置
到
0
-
如果我们在乞求一个词,我们确实有一个词的性格
mb\U转换\U案例
测验。
幸运的是,
unicode character properties in regex
你可以在这里救我们。
忠实的复制品
mb\U转换\U案例
如果没有问题,转换成小写会变成:
function mb_convert_case_utf8_variation($s) {
$arr = preg_split("//u", $s, -1, PREG_SPLIT_NO_EMPTY);
$result = "";
$mode = false;
foreach ($arr as $char) {
$res = preg_match(
'/\\p{Mn}|\\p{Me}|\\p{Cf}|\\p{Lm}|\\p{Sk}|\\p{Lu}|\\p{Ll}|'.
'\\p{Lt}|\\p{Sk}|\\p{Cs}/u', $char) == 1;
if ($mode) {
if (!$res)
$mode = false;
}
elseif ($res) {
$mode = true;
$char = mb_convert_case($char, MB_CASE_TITLE, "UTF-8");
}
$result .= $char;
}
return $result;
}
测试:
echo mb_convert_case_utf8_variation("HETÃ1200 Ãáxt Ãtring uii");
给予:
HETÃ1200 Ãáxt Ãtring Uii