Я хочу реализовать небольшую процедуру, которая генерирует множественную форму имени сущности на испанском языке. В основном, он принимает 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, но я не могу найти эквивалент char.IsLower
C #. Единственное, что я нашел, это ctype_lower
, но в качестве ввода требуется строка , а создание / тестирование / отброс нескольких строк будет слишком неэффективным. Есть ли у PHP функция, которая проверяет, находится ли один символ в нижнем регистре?
Ну, во-первых, создание нескольких строк не является неэффективным. Строка является родным типом в PHP, и это довольно эффективно при этом. Я бы сделал что-то вроде этого:
$callback = function($match) { return $match[1] . 's' . $match[2]; }; $string = preg_replace_callback('/^([A-Za-z][az]*)([AZ]|$)/', $callback, $string);
Или, как предлагает Кевин в комментариях:
$string = preg_replace('/^([A-Za-z][az]*)([AZ]|$)/', '\1s\2', $string);
Он более эффективен, так как ему не нужно захватывать первый символ, отличный от нижнего.
Нет никакой разницы между string
и string
поэтому использование ctype_lower()
абсолютно нормально. На самом деле в PHP нет даже реальной string
, string
в PHP – это просто куча двоичных данных.
Я действительно не знаю, может ли ctype_lower()
работать с расширенными наборами символов и символами вне диапазона ASCII. Если это требование, вы, возможно, должны использовать возможности unicode PCRE для проверки символов более низкого порядка вне диапазона ASCII.
Вы можете использовать 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)