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.

Réponses:


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

http://php.net/substr_replace


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


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
?>

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;
}  

4
str_replace($sub_str, $insert_str.$sub_str, $org_str);

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


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.

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;
}

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;

}  

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);
}

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.