2010-05-07 29 views
285

Estoy tratando de verificar si una cadena comienza con http. ¿Cómo puedo hacer este control?¿Cómo comprobar si una cadena comienza con una cadena especificada?

$string1 = 'google.com'; 
$string2 = 'http://www.google.com'; 
+0

Es posible que desee probar [esta biblioteca independiente] (https: // github.com/delight-im/PHP-Str) que se puede utilizar sin ningún marco. Incluye tanto 'startsWith' como' endsWith' en versiones sensibles a mayúsculas y minúsculas. – caw

Respuesta

480
substr($string_n, 0, 4) === "http" 

Si está intentando asegurarse de que no se trata de otro protocolo. Usaría http:// en su lugar, ya que https también coincidiría, y otras cosas como http-protocol.com.

substr($string_n, 0, 7) === "http://" 

Y en general:

substr($string, 0, strlen($query)) === $query 
+43

No hay necesidad de codificar la longitud de cadena como se indica a continuación si su aguja es una variable. Simplemente use substr ($ string, 0, strlen ($ query)) === $ consulta –

+13

Tenga cuidado al usar cadenas multibyte utf8! mb_substr es su amigo – CoR

+0

No necesita utilizar las funciones 'mb_ *' cuando usa 'substr ($ string, 0, strlen ($ query)) == = $ query' – Finesse

387

Uso strpos():

if (strpos($string2, 'http') === 0) { 
    // It starts with 'http' 
} 

Recuerda las tres signos de igual (===). No funcionará correctamente si solo usa dos. Esto se debe a que strpos() devolverá false si no se puede encontrar la aguja en el pajar.

+16

No es necesario buscar toda la cadena ('strpos' se detiene si se encuentra la aguja o se llega al final) si solo necesita mirar una posición específica. – Gumbo

+0

Lo que es trivial para cadenas cortas, pero voy a apoyar tu sugerencia de substr(). – awgy

+5

use substr en su lugar, ya que strpos busca todo el pajar para la aguja, mientras que substr solo comprueba el comienzo (que es más rápido para cadenas largas) – nonchip

-5

también funcionan:

if (eregi("^http:", $url)) { 
echo "OK"; 
} 
+19

** 2013 Aviso: ** Esta función ha sido DEPURADA a partir de PHP 5.3.0. Confiar en esta característica es altamente desaconsejado. [ver php.net eregi function para más información] (http://php.net/manual/en/function.eregi.php) – gmo

49

También existe la strncmp() función y strncasecmp() función que es perfecto para esta situación:

if (strncmp($string_n, "http", 4) === 0) 

En general:

if (strncmp($string_n, $prefix, strlen($prefix)) === 0) 

La ventaja sobre el enfoque substr() es que strncmp() simplemente hace lo que hay que hacer, sin crear una cadena temporal.

+3

strncmp() es bueno porque no genera basura, como lo hace substr(). También es mejor que strpos() porque no necesita escanear toda la cadena. Es menos conveniente porque tiene que codificar o calcular la longitud del prefijo, y si lo hace incorrectamente/lo cambia más adelante, la función puede dejar de funcionar. –

+2

Wow, hay muchas respuestas a este simple problema. Elegí la tuya como la mejor: simplemente devuelve strncmp ($ url, 'http', 4) === 0. Muchas funciones de cadena para elegir en el manual, pero esta es la solución obvia para el problema y yo ' Supongo que es el mejor rendimiento. –

4

Puede verificar si su cadena comienza con http o https usando la función preg_match, que se muestra a continuación.

$url = 'http://www.google.com'; 
$http = preg_match('/^http[^s]/i', $url); 
$https = preg_match('/^https/i', $url); 

echo 'the url ' . ($http ? 'does' : 'does not') . ' start with http'; 
echo 'the url ' . ($https ? 'does' : 'does not') . ' start with https'; 
+0

Si alguien lee responder esto, entonces los ternaries '? true: false' son redundantes y se pueden eliminar completamente –

31

Se puede utilizar una expresión regular sencilla (versión actualizada del usuario Viriathus como eregi está en desuso)

if (preg_match('#^http#', $url) === 1) { 
    // Starts with http (case sensitive). 
} 

o si desea un caso insensible búsqueda

if (preg_match('#^http#i', $url) === 1) { 
    // Starts with http (case insensitive). 
} 

expresiones regulares permitir realizar tareas más complejas

if (preg_match('#^https?://#i', $url) === 1) { 
    // Starts with http:// or https:// (case insensitive). 
} 

En cuanto a rendimiento, no necesita crear una nueva cadena (a diferencia de substr) ni analizar toda la cadena si no comienza con lo que desea. Tendrás una penalización de rendimiento la primera vez que uses la expresión regular (debes crearla/compilarla).

Esta extensión mantiene un caché global por subproceso de expresiones regulares compiladas (hasta 4096). http://www.php.net/manual/en/intro.pcre.php

+0

+1 de mi parte. –

+2

regex es mucho más complejo, luego una operación strpos o substr, por lo que cuesta más rendimiento y en esta tarea definitivamente no es necesario – Sharpy35

+1

@ Sharpy35: tal vez, pero no pienso en el costo de rendimiento a menos que lo haya detectado está haciendo que el sistema sea demasiado lento Evite optimizaciones prematuras. Además, la expresión regular es mucho más poderosa, es algo que los desarrolladores deberían saber. – user276648

Cuestiones relacionadas