Пример: у меня есть $variable = "_foo"
, и я хочу абсолютно убедиться, что переменная $ не начинается с подчеркивания "_"
. Как я могу это сделать в PHP? Есть ли доступ к массиву char за строкой?
Вы можете проверить функцию substr
в php и перенести первый символ таким образом:
http://php.net/manual/en/function.substr.php
if (substr('_abcdef', 0, 1) === '_') { ... }
$variable[0] != "_"
В PHP вы можете получить конкретный символ строки с номенклатурой массива. $variable[0]
– это первый символ строки (если $ variable – строка).
Поскольку кто-то упомянул об эффективности, я сравнивал функции, данные до сих пор из любопытства:
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
Как вы можете видеть, обработка стога сена в качестве массива для поиска символа на первой позиции всегда является самым быстрым решением. Он также всегда работает на равной скорости, независимо от длины строки. Использование strpos
быстрее, чем substr
для коротких строк, но медленнее для длинных строк, когда строка не начинается с префикса. Однако разница не имеет значения. stripos
невероятно медленная с длинными струнами. preg_match
выполняет в основном то же самое независимо от длины строки, но только посредственно по скорости. Решение mb_substr
работает хуже, хотя, вероятно, более надежным.
Учитывая, что эти цифры рассчитаны на 100 000 прогонов, должно быть очевидно, что мы говорим о 0,0000x секунд за звонок. Выбирать один над другим для эффективности – это бесполезная микро-оптимизация, если ваше приложение не startsWith
проверкой на жизнь.
Это самый простой ответ, в котором вас не беспокоит производительность:
if (strpos($string, '_') === 0) { # code }
Если strpos возвращает 0
это означает, что то, что вы искали, начинается с символа 0
, начала строки.
Он подробно описан здесь: http://uk3.php.net/manual/en/function.strpos.php
(PS $string[0] === '_'
– лучший ответ)
function starts_with($s, $prefix){ // returns a bool return strpos($s, $prefix) === 0; } starts_with($variable, "_");
Здесь лучше начать с функции:
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; }
Чтобы основываться на ответе 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.