代码之家  ›  专栏  ›  技术社区  ›  Lyon

php mb\u convert\u case()保留大写单词

  •  3
  • Lyon  · 技术社区  · 15 年前

    假设我有一个字符串“HET1200 text string”,我需要它改为“HET1200 text string”。编码应该是UTF-8。

    mb_convert_case($string, MB_CASE_TITLE, "UTF-8"); 但这就把“HET1200”改成了“HET1200”。

    我可以指定一个例外,但它不会是详尽的。所以我宁愿所有的大写单词都保持大写。

    谢谢:)

    1 回复  |  直到 15 年前
        1
  •  5
  •   Artefacto    5 年前

    好吧,让我们试着重新创造 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
    
    推荐文章