2010-12-20 28 views
14

Me pregunto por qué este código no funciona:Comprobación de si la cadena contiene "http: //"

// check to see if string contains "HTTP://" in front 

if(strpos($URL, "http://")) $URL = $URL; 
else $URL = "http://$URL"; 

Si no encontró que la cadena no contiene "http: //" la cadena final es "HTTP: // HTTP: //foo.foo" si contiene "http: //" al frente.

+0

Si ese es el quid real, también puede que quiera usar 'stripos', por lo que encuentra el HTTP mayúsculas: // también, con' if (stripos ($ URL, "http: //") === 0) ' – mario

+0

Puede encontrar [' s ($ str) -> startsWithIgnoreCase ('http: //') '] (https: // github .com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php # L81) útil, como se encuentra en [esta biblioteca independiente] (https://github.com/delight-im/PHP-Str). – caw

Respuesta

34

Porque devuelve 0 para esa cadena, que se evalúa como falsa. Las cadenas se indexan-cero y, como tal, si http:// se encuentra al principio de la cadena, la posición es 0 y no por 1.

Es necesario comparar por la desigualdad estricta a booleano falso usando !==:

if(strpos($URL, "http://") !== false) 
+7

probablemente 'if (substr ($ url, 0, 7) == 'http: //')' podría ser más rápido. Pero este no es el lugar donde deberíamos aplicar optimizaciones ;-) – zerkms

+0

@zerkms: Wow, tienes razón. Y tienes razón de nuevo. : P – BoltClock

+0

@BoltClock: lo revisaste? Curioso de ver resultados en ideone, por ejemplo ;-) – zerkms

9

@ El método de BoltClock funcionará.

Alternativamente, si su cadena es una URL que puede utilizarse parse_url(), que devolverá los componentes de URL en una matriz asociativa, así:

print_r(parse_url("http://www.google.com.au/")); 


Array 
(
    [scheme] => http 
    [host] => www.google.com.au 
    [path] =>/
) 

El scheme es lo que está buscando. Puede usar parse_url() junto con in_array para determinar si existe http dentro de la cadena URL.

$strUrl  = "http://www.google.com?query_string=10#fragment"; 
$arrParsedUrl = parse_url($strUrl); 
if (!empty($arrParsedUrl['scheme'])) 
{ 
    // Contains http:// schema 
    if ($arrParsedUrl['scheme'] === "http") 
    { 

    } 
    // Contains https:// schema 
    else if ($arrParsedUrl['scheme'] === "https") 
    { 

    } 
} 
// Don't contains http:// or https:// 
else 
{ 

} 

Editar:

Se puede utilizar como $url["scheme"]=="http" @mario sugirió en lugar de in_array(), esto sería una mejor forma de hacerlo: D

+2

Hmm, en lugar de 'in_array()' puedes usar '($ url [" scheme "] ==" http ")'. – mario

+0

Acabo de mencionarlo para casos de bordes extraños como 'parse_url (" ftp: // http? Http # http ")' – mario

+0

@mario punto justo. Respuesta original editada :) –

0

Puede utilizar substr_compare() [PHP Docs].

Tenga cuidado con lo que devuelve la función. Si las cadenas coinciden, devuelve 0. Para otros valores devueltos, puede verificar los documentos PHP. También hay un parámetro para verificar cadenas sensibles a mayúsculas y minúsculas. Si lo especifica VERDADERO, verificará letras mayúsculas.

Así que simplemente hay que escribir como sigue en su problema:

if((substr_compare($URL,"http://",0,7)) === 0) $URL = $URL; 
else $URL = "http://$URL"; 
5
if(preg_match("@^http://@i",$String)) 
    $String = preg_replace("@(http://)[email protected]",'http://',$String); 
else 
    $String = 'http://'.$String; 
1

que ha de comprobar si la cadena contiene “http: //” o no

A continuación código está trabajando perfectamente.

<?php 
$URL = 'http://google.com'; 
$weblink = $URL; 
    if(strpos($weblink, "http://") !== false){ } 
    else { $weblink = "http://".$weblink; } 
?> 
    <a class="weblink" <?php if($weblink != 'http://'){ ?> href="<?php echo $weblink; ?>"<?php } ?> target="_blank">Buy Now</a> 

Disfrute de chicos ...

4

Es necesario recordar acerca https://. Prueba esto: solución

private function http_check($url) { 
    $return = $url; 
    if ((!(substr($url, 0, 7) == 'http://')) && (!(substr($url, 0, 8) == 'https://'))) { 
     $return = 'http://' . $url; 
    } 
    return $return; 
} 
-2

Una línea:

$sURL = 'http://'.str_ireplace('http://','',$sURL); 
+0

Tiene que _check_, no _create_ URL. – czachor

Cuestiones relacionadas