session_destroy - ¿Cómo verificar si una cadena comienza con "_" en PHP?
recuperar session php (7)
Aquí hay un mejor comienzo con la función:
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;
}
Esta pregunta ya tiene una respuesta aquí:
- Las funciones startsWith () y endsWith () en PHP 30 respuestas
Ejemplo: Tengo una $variable = "_foo"
, y quiero estar absolutamente seguro de que la variable $ no comienza con un guión bajo "_"
. ¿Cómo puedo hacer eso en PHP? ¿Hay algún acceso a la matriz de caracteres detrás de la cadena?
Desde que alguien mencionó la eficiencia, he evaluado las funciones dadas hasta ahora por curiosidad:
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;
}
Aquí están los resultados en mi máquina DualCore promedio con 100,000 carreras cada uno
// 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
Como puede ver, tratar la pajar como una matriz para descubrir el carácter en la primera posición es siempre la solución más rápida . También se realiza siempre a la misma velocidad, independientemente de la longitud de la cadena. Usar strpos
es más rápido que substr
para cadenas cortas pero más lento para cadenas largas, cuando la cadena no comienza con el prefijo. Sin embargo, la diferencia es irrelevante. stripos
es increíblemente lento con cuerdas largas. preg_match
realiza casi lo mismo independientemente de la longitud de la cuerda, pero solo tiene una velocidad mediocre. La solución mb_substr
tiene el peor desempeño, aunque probablemente sea más confiable.
Dado que estos números son para 100.000 carreras, debería ser obvio que estamos hablando de 0.0000x segundos por llamada. Elegir uno sobre el otro por eficiencia es una startsWith
sin valor, a menos que su aplicación esté startsWith
comprobación de la vida.
Esta es la respuesta más simple cuando no te preocupa el rendimiento:
if (strpos($string, ''_'') === 0) {
# code
}
Si strpos devuelve 0
, significa que lo que estaba buscando comienza en el carácter 0
, el inicio de la cadena.
Se documenta a fondo aquí: http://uk3.php.net/manual/en/function.strpos.php
(PS $string[0] === ''_''
es la mejor respuesta)
Para construir sobre la respuesta de pinusnegra, y en respuesta al comentario de Gumbo sobre esa respuesta:
function has_leading_underscore($string) {
return $string[0] === ''_'';
}
Al ejecutarse en PHP 5.3.0, lo siguiente funciona y devuelve el valor esperado, incluso sin verificar si la cadena tiene al menos 1 carácter de longitud:
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
*/
No sé cómo reaccionarán otras versiones de PHP, pero si todas funcionan, entonces este método es probablemente más eficiente que la ruta substr.
Puede revisar la función substr
en php y capturar el primer carácter de esa manera:
http://php.net/manual/en/function.substr.php
if (substr(''_abcdef'', 0, 1) === ''_'') { ... }
function starts_with($s, $prefix){
// returns a bool
return strpos($s, $prefix) === 0;
}
starts_with($variable, "_");
$variable[0] != "_"
¿Como funciona?
En PHP puede obtener el carácter particular de una cadena con notación de índice de matriz. $variable[0]
es el primer carácter de una cadena (si $ variable es una cadena).