Je veux une version de qui remplace uniquement la première occurrence de
dans la `` . Y at-il une solution facile à ce, ou ai-je besoin d’une solution hacky ?
Réponses
Trop de publicités?Peut être fait avec preg_replace:
La magie est dans le quatrième paramètre optionnel [limite]. De la documentation :
[Limite] - les remplacements possibles maximum pour chaque modèle dans chaque chaîne subject. Par défaut, -1 (aucune limite).
Edit: les deux réponses ont été mis à jour et sont maintenant correctes. Je vais laisser la réponse puisque la fonction timings sont encore utiles.
Les réponses par "zombat" et " trop de php ne sont malheureusement pas correct. C'est une révision à la réponse zombat posté (que je n'ai pas assez de réputation pour poster un commentaire):
$pos = strpos($haystack,$needle);
if ($pos !== false) {
$newstring = substr_replace($haystack,$replace,$pos,strlen($needle));
}
Remarque le strlen($aiguille), au lieu de strlen($remplacer). Zombat l'exemple ne fonctionnera correctement que si l'aiguille et de les remplacer sont de la même longueur.
Voici la même fonctionnalité dans une fonction avec la même signature que le PHP est propre str_replace:
function str_replace_first($search, $replace, $subject) {
$pos = strpos($subject, $search);
if ($pos !== false) {
$subject = substr_replace($subject, $replace, $pos, strlen($search));
}
return $subject;
}
C'est la version révisée de la réponse de " trop de php:
implode($replace, explode($search, $subject, 2));
Note 2 à la fin au lieu de 1. Ou en fonction de format:
function str_replace_first($search, $replace, $subject) {
return implode($replace, explode($search, $subject, 2));
}
J'ai programmé les deux fonctions et la première est deux fois plus vite si aucune correspondance n'est trouvée. Ils sont la même vitesse lorsqu'une correspondance est trouvée.
S'EST DEMANDÉ QUEL ÉTAIT LE PLUS RAPIDE...DONC JE LES AI TESTÉS TOUS LES
VOUS TROUVEREZ CI-DESSOUS
- UNE LISTE COMPLÈTE DE TOUTES LES FONCTIONS QUI ONT ÉTÉ APPORTÉES SUR CETTE PAGE
- Un TEST d'évaluation POUR CHAQUE CONTRIBUTION (moyenne des temps d'exécution de plus de 10 000 pistes)
- Les LIENS POUR CHAQUE RÉPONSE (pour le code complet)
Toutes les Fonctions ont été testés avec les mêmes paramètres
$string = 'OOO.OOO.OOO.S';
$search = 'OOO';
$replace = 'B';
Les fonctions qui ont été de remplacer UNIQUEMENT la PREMIÈRE occurrence d'une chaîne dans une chaîne
-
substr_replace($string,$replace,0,strlen($recherche)); (
[CONTRIBUTED BY] => zombat [OOO.OOO.OOO.S] => B.OOO.OOO.S [AVERAGE TIME] => 0.0000062883 [# OF TRIES] => 10000 [SLOWER BY] => FASTEST )
-
replace_first($recherche,$replace,$string);
( [CONTRIBUTED BY] => too much php [OOO.OOO.OOO.S] => B.OOO.OOO.S [AVERAGE TIME] => 0.0000073902 [# OF TRIES] => 10000 [SLOWER BY] => 17.52% )
-
preg_replace($recherche, $replace, $string, 1);(
[CONTRIBUTED BY] => karim79 [OOO.OOO.OOO.S] => B.OOO.OOO.S [AVERAGE TIME] => 0.0000077519 [# OF TRIES] => 10000 [SLOWER BY] => 23.27% )
-
str_replace_once($recherche, $replace, $string);(
[CONTRIBUTED BY] => happyhardik [OOO.OOO.OOO.S] => B.OOO.OOO.S [AVERAGE TIME] => 0.0000082286 [# OF TRIES] => 10000 [SLOWER BY] => 30.86% )
-
str_replace_limit($recherche, $replace, $string, $count, 1);(
[CONTRIBUTED BY] => bfrohs - expanded renocor [OOO.OOO.OOO.S] => B.OOO.OOO.S [AVERAGE TIME] => 0.0000083342 [# OF TRIES] => 10000 [SLOWER BY] => 32.54% )
-
str_replace_limit($recherche, $replace, $string, 1);(
[CONTRIBUTED BY] => renocor [OOO.OOO.OOO.S] => B.OOO.OOO.S [AVERAGE TIME] => 0.0000093116 [# OF TRIES] => 10000 [SLOWER BY] => 48.08% )
-
str_replace_limit($string, $recherche, $replace, 1, 0);(
[CONTRIBUTED BY] => jayoaK [OOO.OOO.OOO.S] => B.OOO.OOO.S [AVERAGE TIME] => 0.0000093862 [# OF TRIES] => 10000 [SLOWER BY] => 49.26% )
Les fonctions qui ne remplacer que la DERNIÈRE occurrence d'une chaîne dans une chaîne
-
substr_replace($string,$replace,strrpos($string,$recherche),strlen($recherche));(
[CONTRIBUTED BY] => oLinkSoftware - modified zombat [OOO.OOO.OOO.S] => OOO.OOO.B.S [AVERAGE TIME] => 0.0000068083 [# OF TRIES] => 10000 [SLOWER BY] => FASTEST )
-
strrev(implode(strrev($remplacer),explode(strrev($recherche),strrev($string),2)));(
[CONTRIBUTED BY] => oLinkSoftware [OOO.OOO.OOO.S] => OOO.OOO.B.S [AVERAGE TIME] => 0.0000084460 [# OF TRIES] => 10000 [SLOWER BY] => 24.05% )