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';
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';
Utiliser le str_starts_with fonction :
str_starts_with('http://www.google.com', 'http')
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
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.
Soyez prudent lorsque vous utilisez des chaînes utf8 multioctets ! mb_substr est votre ami.
Vous n'êtes pas tenu d'utiliser mb_*
lorsque vous utilisez les fonctions substr($string, 0, strlen($query)) === $query
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.
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.
Ce qui est trivial pour les chaînes courtes, mais je vais donner un coup de pouce à votre suggestion substr().
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).
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.
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.
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.
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.
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
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.
@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.
Je n'ai pas dit que je ne connaissais pas les regex ;) j'évite juste de les utiliser quand je le peux :)
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://';
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.
0 votes
Vous pouvez essayer cette bibliothèque autonome qui peut être utilisé sans aucun cadre. Il comprend à la fois
startsWith
yendsWith
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
yends_with
des fonctions d'aide à votre disposition.2 votes
PHP 8.0 introduit de nouvelles méthodes pour ce travail
str_starts_with
ystr_end_with
: stackoverflow.com/a/64160081/7082164