354 votes

À l’aide de str_replace afin qu’il n’agit que sur le premier match ?

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 ?

683voto

zombat Points 46702

Il n’y a pas de version de celui-ci, mais la solution n’est pas du tout hacky.

Assez facile et enregistre l’altération des performances des expressions régulières.

379voto

karim79 Points 178055

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).

99voto

Bas Points 905

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.

86voto

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


Les fonctions qui ne remplacer que la DERNIÈRE occurrence d'une chaîne dans une chaîne

55voto

too much php Points 27983

Malheureusement, je ne sais pas du tout funciton PHP qui peut faire cela. Vous pouvez rouler vos propres assez facilement, comme ceci :

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