如何在PHP中测试单个字符是否为小写?

时间:2011-03-10 17:16:43

标签: php string

我想实现一个小例程,用西班牙语生成一个实体名称的复数形式。基本上,它需要一个WordInCSharpCase或wordInJavaCase,例如MedioDePago(付款方式),它在第一个非小写字符(不包括第一个字符)之前的右边追加一个“s”,在这种情况下会生成字符串MediosDePago(付款方式)。在C#中,这个例程是:

public string Pluralize(string input)
{
    int i = 0;
    while (++i < input.Length)
        if (!char.IsLower(input[i]))
            break;

    StringBuilder builder = new StringBuilder(input);
    builder.Insert(i, 's');
    return builder.ToString();
}

现在我需要在PHP中实现这个例程,但我找不到C#的char.IsLower的等价物。我发现的唯一的东西是ctype_lower,但它需要一个字符串作为输入,而创建/测试/丢弃几个字符串效率太低。 PHP是否有一个测试单个字符是否为小写的函数?

3 个答案:

答案 0 :(得分:2)

stringchar之间没有区别,因此使用ctype_lower()绝对可以。事实上,PHP中甚至没有真正的string,PHP中的string只是一团二进制数据。

我实际上不知道ctype_lower()是否可以处理扩展字符集和ASCII范围之外的字符。如果这是一项要求,您必须使用PCRE unicode功能来检查ASCII范围之外的小写字符。

答案 1 :(得分:2)

好吧,首先,创建几个字符串效率不高。字符串是PHP中的本机类型,它在执行它时非常有效。我会做的是这样的事情:

$callback = function($match) {
    return $match[1] . 's' . $match[2];
};

$string = preg_replace_callback('/^([A-Za-z][a-z]*)([A-Z]|$)/', $callback, $string);

或者,正如@Kevin在评论中所说:

$string = preg_replace('/^([A-Za-z][a-z]*)([A-Z]|$)/', '\1s\2', $string);

它更有效率,因为它不需要捕获超过第一个非小写字符。

答案 2 :(得分:1)

您可以使用mb_strtolower,例如:

$a = 'a';
var_dump(mb_strtolower($a, "UTF-8") == $a); // bool(true)

$b = 'A';
var_dump(mb_strtolower($b, "UTF-8") == $b); // bool(false)