Insérer une chaîne à la position spécifiée

270

Y a-t-il une fonction PHP qui peut le faire?

J'utilise strpospour obtenir la position d'une sous-chaîne et je veux insérer un stringaprès cette position.

Alex
la source

Réponses:

567
$newstr = substr_replace($oldstr, $str_to_insert, $pos, 0);

http://php.net/substr_replace

urmaul
la source
24
Ce devrait être la réponse acceptée. Les fonctions intégrées ont priorité sur les fonctions créées par l'utilisateur à tout moment.
Benjam
13
Oui, le 4ème argument étant "0", la chaîne de remplacement est insérée sans écraser la chaîne d'origine.
Buttle Butkus
7
Réponse brillante. Mais pour les gens paresseux (comme moi), il devrait y avoir une courte explication dans votre message. Je vais le faire maintenant et copier-coller à partir de php.net: "Bien sûr, si la longueur est nulle, cette fonction aura pour effet d'insérer le remplacement dans la chaîne au décalage de début donné."
Wolfsblvt
7
Attention: la fonction substr_replace () n'est pas sûre sur plusieurs octets! Votre $ pos peut s'avérer être au milieu d'un caractère UTF-8. Vous devrez peut-être utiliser la solution @ tim-cooperer mais en utilisant mb_substr ().
richplane
72
$str = substr($oldstr, 0, $pos) . $str_to_insert . substr($oldstr, $pos);

substr sur PHP Manual

Tim Cooper
la source
J'ai fait une fonction str_insert avec cette ligne, elle est plus réutilisable.
djleop
12

Essayez-le, cela 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
?>
alexdets
la source
7

Utilisez la fonction stringInsert plutôt que la fonction putinplace. J'utilisais la fonction ultérieure pour analyser une requête mysql. Bien que la sortie semble correcte, la requête a entraîné une erreur qui m'a pris un certain temps à retrouver. Ce qui suit est ma version de la fonction stringInsert ne nécessitant qu'un seul paramètre.

function stringInsert($str,$insertstr,$pos)
{
    $str = substr($str, 0, $pos) . $insertstr . substr($str, $pos);
    return $str;
}  
user2958137
la source
4
str_replace($sub_str, $insert_str.$sub_str, $org_str);
xdazz
la source
@minitech L'op a dit using strpos to get the position of a substring, donc substringvient en premier. Et il n'a pas dit de trouver un seul poste.
xdazz
3

J'ai une ancienne fonction pour ça:

function putinplace($string=NULL, $put=NULL, $position=false)
{
    $d1=$d2=$i=false;
    $d=array(strlen($string), strlen($put));
    if($position > $d[0]) $position=$d[0];
    for($i=$d[0]; $i >= $position; $i--) $string[$i+$d[1]]=$string[$i];
    for($i=0; $i<$d[1]; $i++) $string[$position+$i]=$put[$i];
    return $string;
}

// Explanation
$string='My dog dont love postman'; // string
$put="'"; // put ' on position
$position=10; // number of characters (position)
print_r( putinplace($string, $put, $position) ); //RESULT: My dog don't love postman

Il s'agit d'une petite fonction puissante qui remplit parfaitement son rôle.

Ivijan Stefan Stipić
la source
3

C'était ma solution simple, aussi ajouter du texte à la ligne suivante après avoir trouvé le mot-clé.

$oldstring = "This is a test\n#FINDME#\nOther text and data.";

function insert ($string, $keyword, $body) {
   return substr_replace($string, PHP_EOL . $body, strpos($string, $keyword) + strlen($keyword), 0);
}

echo insert($oldstring, "#FINDME#", "Insert this awesome string below findme!!!");

Production:

This is a test
#FINDME#
Insert this awesome string below findme!!!
Other text and data.
Lance Badger
la source
3

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 fait l'insertion sur chacune d'entre elles, alors voici:

EDIT: On dirait que mon ancienne fonction supposait qu'il$insertstrn'y avait qu'un seul caractère et que le tableau avait été 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;
}
chiliNUT
la source
1
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 le faire fonctionner. J'ai corrigé votre fonction ici, vous voudrez peut-être modifier votre code: pastebin.com/g9ADpuU4
Matthias S
@MatthiasS merci, la prochaine fois juste modifier ou suggérer de modifier, je n'ai pas remarqué cela jusqu'à 2 ans plus tard
chiliNUT
1

Une manière simple et différente de résoudre:

function stringInsert($str,$insertstr,$pos)
{
  $count_str=strlen($str);
  for($i=0;$i<$pos;$i++)
    {
    $new_str .= $str[$i];
    }

    $new_str .="$insertstr";

   for($i=$pos;$i<$count_str;$i++)
    {
    $new_str .= $str[$i];
    }

  return $new_str;

}  
jewelhuq
la source
peut-être aussi indiquer comment la fonction est utilisée?
Rotimi
1
function insSubstr($str, $sub, $posStart, $posEnd){
  return mb_substr($str, 0, $posStart) . $sub . mb_substr($str, $posEnd + 1);
}
Ivan Ivan
la source
$posEndest inutile. La question concernait l'insertion d'une sous-chaîne après la position spécifiée.
Styx
Oui, mais j'ai créé cette fonction pour mon projet. où j'avais besoin à un endroit de remplacer et dans un autre juste insérer. Ma fonction fonctionne également pour cette question, donc je ne peux pas comprendre pourquoi vous m'avez fait moins?
Ivan Ivan
0

Des réponses étranges ici! Vous pouvez facilement insérer des chaînes dans d'autres chaînes avec sprintf [lien vers la documentation]. La fonction est extrêmement puissante et peut également gérer plusieurs éléments et d'autres types de données.

$color = 'green';
sprintf('I like %s apples.', $color);

vous donne la chaîne

I like green apples.
Sliq
la source
1
C'est zonte. mais il ne gère pas une approche programmatique. Nous avons généralement 'I like apples.'comme variable. Nous devons donc insérer d' %sabord dans la chaîne, ce qui revient au problème d'origine
KeitelDOG