Подтвердить что ты не робот

Как проверить, начинается ли строка с "_" в PHP?

Пример: у меня есть $variable = "_foo", и я хочу абсолютно убедиться, что переменная $не начинается с подчеркивания "_". Как я могу это сделать в PHP? Есть ли доступ к массиву char за строкой?

4b9b3361

Ответ 1

Вы можете проверить функцию substr в php и перенести первый символ таким образом:

http://php.net/manual/en/function.substr.php

if (substr('_abcdef', 0, 1) === '_') { ... }

Ответ 2

$variable[0] != "_"

Как это работает?

В PHP вы можете получить конкретный символ строки с нотами индекса массива. $variable[0] - это первый символ строки (если $variable - строка).

Ответ 3

Так как кто-то упомянул эффективность, я сравнивал функции, данные до сих пор из любопытства:

function startsWith1($str, $char) {
    return strpos($str, $char) === 0;
}
function startsWith2($str, $char) {
    return stripos($str, $char) === 0;
}
function startsWith3($str, $char) {
    return substr($str, 0, 1) === $char;
}
function startsWith4($str, $char){
    return $str[0] === $char;
}
function startsWith5($str, $char){
    return (bool) preg_match('/^' . $char . '/', $str);
}
function startsWith6($str, $char) {
    if (is_null($encoding)) $encoding = mb_internal_encoding();
    return mb_substr($str, 0, mb_strlen($char, $encoding), $encoding) === $char;
}

Вот результаты на моей средней машине DualCore со 100 000 прогонов каждый

// Testing '_string'
startsWith1 took 0.385906934738
startsWith2 took 0.457293987274
startsWith3 took 0.412894964218
startsWith4 took 0.366240024567 <-- fastest
startsWith5 took 0.642996072769
startsWith6 took 1.39859509468

// Tested "string"
startsWith1 took 0.384965896606
startsWith2 took 0.445554971695
startsWith3 took 0.42377281189
startsWith4 took 0.373164176941 <-- fastest
startsWith5 took 0.630424022675
startsWith6 took 1.40699005127

// Tested 1000 char random string [a-z0-9]
startsWith1 took 0.430691003799
startsWith2 took 4.447286129
startsWith3 took 0.413349866867
startsWith4 took 0.368592977524 <-- fastest
startsWith5 took 0.627470016479
startsWith6 took 1.40957403183

// Tested 1000 char random string [a-z0-9] with '_' prefix
startsWith1 took 0.384054899216
startsWith2 took 4.41522812843
startsWith3 took 0.408898115158
startsWith4 took 0.363884925842 <-- fastest
startsWith5 took 0.638479948044
startsWith6 took 1.41304707527

Как вы можете видеть, обработка стога сена в качестве массива для поиска char в первой позиции всегда является самым быстрым решением. Он также всегда работает на равной скорости, независимо от длины строки. Использование strpos быстрее, чем substr для коротких строк, но медленнее для длинных строк, когда строка не начинается с префикса. Однако разница не имеет значения. stripos невероятно медленный с длинными строками. preg_match выполняет в основном то же самое независимо от длины строки, но только посредственно по скорости. Решение mb_substr работает хуже, хотя, вероятно, более надежно.

Учитывая, что эти цифры рассчитаны на 100 000 прогонов, должно быть очевидно, что мы говорим о 0,0000x секунд за звонок. Выбирать один над другим для эффективности - это бесполезная микро-оптимизация, если ваше приложение не делает startsWith проверку на жизнь.

Ответ 4

Это самый простой ответ, в котором вас не беспокоит производительность:

if (strpos($string, '_') === 0) {
    # code
}

Если strpos возвращает 0, это означает, что то, что вы искали, начинается с символа 0, начала строки.

Здесь подробно описано: http://uk3.php.net/manual/en/function.strpos.php

(PS $string[0] === '_' - лучший ответ)

Ответ 5

function starts_with($s, $prefix){
    // returns a bool
    return strpos($s, $prefix) === 0;
}

starts_with($variable, "_");

Ответ 6

Здесь лучше начать с функции:

function mb_startsWith($str, $prefix, $encoding=null) {
    if (is_null($encoding)) $encoding = mb_internal_encoding();
    return mb_substr($str, 0, mb_strlen($prefix, $encoding), $encoding) === $prefix;
}

Ответ 7

Чтобы построить ответ на pinusnegra, и в ответ на комментарий Gumbo на этот ответ:

function has_leading_underscore($string) {

    return $string[0] === '_';

}

Запустив на PHP 5.3.0, следующее работает и возвращает ожидаемое значение, даже если не проверяется длина строки не менее 1 символа:

echo has_leading_underscore('_somestring').', ';
echo has_leading_underscore('somestring').', ';
echo has_leading_underscore('').', ';
echo has_leading_underscore(null).', ';
echo has_leading_underscore(false).', ';
echo has_leading_underscore(0).', ';
echo has_leading_underscore(array('_foo', 'bar'));

/*
 * output: true, false, false, false, false, false, false
 */

Я не знаю, как будут реагировать другие версии PHP, но если они все работают, то этот метод, вероятно, более эффективен, чем маршрут substr.