Intereting Posts

Как проверить, является ли один символ нижним регистром в 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, но я не могу найти эквивалент 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)