我想实现一个小例程,用西班牙语生成一个实体名称的复数形式。基本上,它需要一个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是否有一个测试单个字符是否为小写的函数?
答案 0 :(得分:2)
string
和char
之间没有区别,因此使用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)