繁体   English   中英

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

[英]How can I test whether a single character is lower case in PHP?

我想实现一个小的例程,该例程生成西班牙语中实体名称的复数形式。 基本上,它使用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的等效char.IsLower 我发现的唯一东西是ctype_lower ,但是它需要一个字符串作为输入,并且创建/测试/丢弃多个字符串将效率很低。 PHP是否具有测试单个字符是否小写的功能?

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

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

好吧,首先,创建多个字符串并不是没有效率的。 字符串是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);

由于不需要捕获第一个非小写字符,因此效率更高。

您可以为此使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM