Как я могу проверить, является ли один символ в нижнем регистре в PHP? - PullRequest
0 голосов
/ 10 марта 2011

Я хочу реализовать небольшую подпрограмму, которая генерирует множественную форму имени сущности на испанском языке.По сути, он принимает 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 ]

2 голосов
/ 10 марта 2011

Ну, во-первых, создание нескольких строк не является неэффективным.Строка является нативным типом в 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 голосов
/ 10 марта 2011

Нет разницы между string и char, поэтому использование ctype_lower() абсолютно нормально. На самом деле в PHP нет даже string, а string в PHP - это просто блок двоичных данных.

Я на самом деле не знаю, может ли ctype_lower() иметь дело с расширенными наборами символов и символами вне диапазона ASCII. Если это требование, возможно, вы должны использовать возможности Unicode PCRE для проверки символов нижнего регистра вне диапазона ASCII.

1 голос
/ 10 марта 2011

Вы можете использовать для этого 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...