590 votes

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

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

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

0 votes

Vous pouvez essayer cette bibliothèque autonome qui peut être utilisé sans aucun cadre. Il comprend à la fois startsWith y endsWith en version sensible à la casse et en version insensible à la casse.

3 votes

Comme il s'agit d'un framework très répandu, il convient de mentionner que si vous utilisez Laravel, vous disposez de l'option starts_with y ends_with des fonctions d'aide à votre disposition.

2 votes

PHP 8.0 introduit de nouvelles méthodes pour ce travail str_starts_with y str_end_with : stackoverflow.com/a/64160081/7082164

1021voto

Kendall Hopkins Points 12193

PHP 8 ou plus récent :

Utiliser le str_starts_with fonction :

str_starts_with('http://www.google.com', 'http')

PHP 7 ou plus ancien :

Utiliser le substrats pour renvoyer une partie d'une chaîne de caractères.

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

Si vous essayez de vous assurer qu'il ne s'agit pas d'un autre protocole. J'utiliserais http:// à la place, puisque https correspondrait également, et d'autres choses comme http-protocol.com.

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

Et d'une manière générale :

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

104 votes

Il n'est pas nécessaire de coder en dur la longueur de la chaîne comme indiqué ci-dessous si votre aiguille est une variable. Utilisez simplement substr( $string, 0, strlen($query) ) === $query.

19 votes

Soyez prudent lorsque vous utilisez des chaînes utf8 multioctets ! mb_substr est votre ami.

3 votes

Vous n'êtes pas tenu d'utiliser mb_* lorsque vous utilisez les fonctions substr($string, 0, strlen($query)) === $query

748voto

awgy Points 3834

Utilisation strpos() :

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

Rappelez-vous les trois signes d'égalité ( === ). Il ne fonctionnera pas correctement si vous n'en utilisez que deux. Cela s'explique par le fait que strpos() renverra false si l'aiguille ne peut être trouvée dans la botte de foin.

34 votes

Il n'est pas nécessaire de rechercher toute la chaîne ( strpos s'arrête si l'aiguille est trouvée ou si la fin est atteinte) si vous avez seulement besoin de regarder une position spécifique.

0 votes

Ce qui est trivial pour les chaînes courtes, mais je vais donner un coup de pouce à votre suggestion substr().

8 votes

Utilisez substr à la place, car strpos recherche l'aiguille dans toute la botte de foin, alors que substr ne vérifie que le début (ce qui est plus rapide pour les longues chaînes).

119voto

Sid Points 578

Il y a aussi le strncmp() et strncasecmp() qui convient parfaitement à 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 à la substr() L'approche est la suivante strncmp() se contente de faire ce qui doit être fait, sans créer de chaîne temporaire.

8 votes

Strncmp() est bon parce qu'il ne génère pas de déchets, comme le fait substr(). Elle est également meilleure que strpos() parce qu'elle n'a pas besoin de parcourir toute la chaîne. Elle est moins pratique car vous devez coder en dur ou calculer la longueur du préfixe, et si vous vous trompez ou si vous le changez plus tard, la fonction peut cesser de fonctionner.

4 votes

Il y a beaucoup de réponses à ce problème simple. J'ai choisi la vôtre comme étant la meilleure : return strncmp($url, 'http', 4) === 0. Il y a beaucoup de fonctions de chaînes de caractères à choisir dans le manuel, mais c'est celle qui correspond le mieux au problème et je me risquerais à dire que c'est celle qui est la plus performante.

0 votes

C'est une très bonne réponse, qui fait exactement ce qui est demandé, à savoir comparer le début des chaînes de caractères, et non pas trouver, comparer. Je ne sais pas pourquoi cette réponse n'est pas sélectionnée ou a si peu de votes positifs.

45voto

user276648 Points 850

Vous pouvez utiliser une simple expression rationnelle (version mise à jour par l'utilisateur viriathus comme eregi est obsolète)

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

ou si vous souhaitez 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 la première fois que vous utiliserez la regex (vous devez la créer/compiler).

Cette extension maintient un système global de cac compilées ( http://www.php.net/manual/en/intro.pcre.php

3 votes

Les expressions rationnelles sont beaucoup plus complexes qu'une opération de type strpos ou substr, elles sont donc plus coûteuses en termes de performances et, dans cette tâche, elles ne sont absolument pas nécessaires.

2 votes

@Sharpy35 : peut-être, mais je ne pense pas au coût des performances à moins d'avoir détecté qu'il rend le système trop lent. Évitez les optimisations prématurées. De plus, les regex sont tellement plus puissantes, c'est vraiment quelque chose que les développeurs devraient savoir.

1 votes

Je n'ai pas dit que je ne connaissais pas les regex ;) j'évite juste de les utiliser quand je le peux :)

12voto

Jake Points 741

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://';

2 votes

Si quelqu'un lit la réponse, alors les ternaires ? true : false sont redondants et peuvent être complètement supprimés

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X