web-dev-qa-db-fra.com

Comment vérifier si une chaîne commence par une chaîne spécifiée?

J'essaie de vérifier si une chaîne commence par http. Comment puis-je faire cette vérification?

$string1 = 'google.com';
$string2 = 'http://www.google.com';
427
Andrew

Utilisez la fonction substr pour renvoyer une partie d'une chaîne.

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

Si vous essayez de vous assurer que ce n'est pas un autre protocole. J'utiliserais plutôt http://, puisque https correspondrait également et d'autres éléments tels que http-protocol.com.

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

Et en général:

substr($string, 0, strlen($query)) === $query
734
Kendall Hopkins

Utilisez strpos() :

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

Rappelez-vous les trois signes égaux (===). Cela ne fonctionnera pas correctement si vous n'en utilisez que deux. Ceci est dû au fait que strpos() retournera false si l'aiguille est introuvable dans la botte de foin.

573
awgy

Il y a aussi la fonction strncmp() et strncasecmp() qui est parfaite pour cette situation:

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

En général:

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

L'avantage par rapport à l'approche substr() est que strncmp() fait simplement ce qu'il faut faire, sans créer de chaîne temporaire.

79
Sid

Vous pouvez utiliser une expression régulière simple (la version mise à jour de l'utilisateur viriathus , car eregi est obsolète)

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

ou si vous voulez une recherche insensible à la casse

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

Les expressions rationnelles permettent d'effectuer des tâches plus complexes

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

En termes de performances, vous n'avez pas besoin de créer une nouvelle chaîne (contrairement à substr) ni d'analyser toute la chaîne si elle ne commence pas par ce que vous voulez. Vous aurez une pénalité de performance si vous utilisez la regex pour la première fois (vous devez le créer/le compiler).

Cette extension maintient un cache global par thread d'expressions régulières compilées (jusqu'à 4096). http://www.php.net/manual/en/intro.pcre.php

42
user276648

Vous pouvez vérifier si votre chaîne commence par http ou https en utilisant la petite fonction ci-dessous.

function has_prefix($string, $prefix) {
   return substr($string, 0, strlen($prefix)) == $prefix;
}

$url   = 'http://www.google.com';
echo 'the url ' . (has_prefix($url, 'http://')  ? 'does' : 'does not') . ' start with http://';
echo 'the url ' . (has_prefix($url, 'https://') ? 'does' : 'does not') . ' start with https://';
5
Jake