336 votes

Insérer une chaîne de caractères à la position spécifiée

Existe-t-il une fonction PHP qui puisse faire cela ?

J'utilise strpos pour obtenir la position d'une sous-chaîne et je veux insérer une string après cette position.

674voto

urmaul Points 1199
$newstr = substr_replace($oldstr, $str_to_insert, $pos, 0);

http://php.net/substr_replace

Dans l'extrait ci-dessus, $pos est utilisé dans le offset de la fonction.

décalage
Si le décalage n'est pas négatif, le remplacement commencera au offset dans la chaîne.

Si l'offset est négatif, le remplacement commencera à l'offset'th caractère à partir de la fin de la chaîne.

29 votes

Cela devrait être la réponse acceptée. Les fonctions intégrées ont toujours la priorité sur les fonctions créées par l'utilisateur.

14 votes

Oui, le quatrième argument étant "0", la chaîne de remplacement est insérée sans écraser la chaîne d'origine.

8 votes

Réponse brillante. Mais pour les paresseux (comme moi) il devrait y avoir une courte explication dans votre post peut-être. Je vais le faire maintenant et faire un copier/coller de php.net : "Bien sûr, si la longueur est égale à zéro, cette fonction aura pour effet d'insérer le remplacement dans la chaîne de caractères au décalage de début donné."

81voto

Tim Cooper Points 55292
$str = substr($oldstr, 0, $pos) . $str_to_insert . substr($oldstr, $pos);

substr sur le manuel PHP

0 votes

J'ai fait une fonction str_insert avec cette ligne, elle est plus réutilisable.

17voto

alexdets Points 191

Essayez-le, il fonctionnera pour n'importe quel nombre de sous-chaînes.

<?php
    $string = 'bcadef abcdef';
    $substr = 'a';
    $attachment = '+++';

    //$position = strpos($string, 'a');

    $newstring = str_replace($substr, $substr.$attachment, $string);

    // bca+++def a+++bcdef
?>

3voto

xdazz Points 85907
str_replace($sub_str, $insert_str.$sub_str, $org_str);

0 votes

@minitech L'opérateur a dit using strpos to get the position of a substring donc le substring vient en premier. Et il n'a pas dit de trouver une seule position.

2 votes

Cette réponse inexpliquée peut effectuer plusieurs remplacements en fonction des chaînes d'entrée utilisées. Cela rend cette réponse de faible valeur et potentiellement dangereuse pour les chercheurs.

3voto

chiliNUT Points 3249

Je voulais juste ajouter quelque chose : j'ai trouvé la réponse de Tim Cooper très utile, je l'ai utilisée pour créer une méthode qui accepte un tableau de positions et qui fait l'insertion sur toutes les positions, donc la voici :

EDIT : On dirait que mon ancienne fonction a supposé $insertstr était seulement un caractère et que le tableau était trié. Cela fonctionne pour une longueur de caractère arbitraire.

function stringInsert($str, $pos, $insertstr) {
    if (!is_array($pos)) {
        $pos = array($pos);
    } else {
        asort($pos);
    }
    $insertionLength = strlen($insertstr);
    $offset = 0;
    foreach ($pos as $p) {
        $str = substr($str, 0, $p + $offset) . $insertstr . substr($str, $p + $offset);
        $offset += $insertionLength;
    }
    return $str;
}

1 votes

Cela ne fonctionne pas. Votre décalage suppose que $interstr ne comporte qu'un seul caractère. Vous devez ajouter un décalage en fonction de la longueur de l'insertstr, commencer par 0 et ajouter après le substr. De plus, vous devez trier les positions de bas en haut pour que cela fonctionne. J'ai corrigé votre fonction ici, vous pourriez vouloir modifier votre code : pastebin.com/g9ADpuU4

0 votes

@MatthiasS merci, la prochaine fois il suffit d'éditer ou de suggérer d'éditer, je ne l'ai remarqué que 2 ans plus tard.

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