Inserisci la stringa nella posizione specificata


270

C'è una funzione PHP che può farlo?

Sto usando strposper ottenere la posizione di una sottostringa e voglio inserire un stringdopo quella posizione.

Risposte:


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

http://php.net/substr_replace


24
Questa dovrebbe essere la risposta accettata. Le funzioni integrate hanno la precedenza sulle funzioni create dall'utente ogni giorno.
Benjam,

13
Sì, il quarto argomento essendo "0" fa sì che la stringa di replaecment venga inserita senza sovrascrivere la stringa originale.
Buttle Butkus,

7
Risposta brillante. Ma per le persone pigre (come me) forse dovrebbe esserci una breve spiegazione nel tuo post. Lo farò ora e copierò'n'paste da php.net: "Naturalmente, se la lunghezza è zero, questa funzione avrà l'effetto di inserire la sostituzione in stringa all'offset iniziale specificato."
Wolfsblvt,

7
Attenzione: la funzione substr_replace () non è sicura per più byte! Il tuo $ pos potrebbe rivelarsi nel mezzo di un personaggio UTF-8. Potrebbe essere necessario utilizzare la soluzione di @ tim-cooper ma utilizzando mb_substr ().
richplane


12

Provalo, funzionerà con qualsiasi numero di sottostringhe

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

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

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

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

7

Utilizzare la funzione stringInsert anziché la funzione putinplace. Stavo usando la funzione successiva per analizzare una query mysql. Anche se l'output sembrava a posto, la query ha provocato un errore che mi ha richiesto un po 'di tempo per rintracciarlo. La seguente è la mia versione della funzione stringInsert che richiede solo un parametro.

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 ha detto using strpos to get the position of a substring, quindi substringviene prima. E non ha detto di trovare solo una posizione.
xdazz

3

Ho una mia vecchia funzione per questo:

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

Questa è una piccola potente funzione che svolge il suo lavoro in modo impeccabile.


3

Questa è stata anche la mia soluzione semplice per aggiungere testo alla riga successiva dopo aver trovato la parola chiave.

$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!!!");

Produzione:

This is a test
#FINDME#
Insert this awesome string below findme!!!
Other text and data.

3

Volevo solo aggiungere qualcosa: ho trovato la risposta di Tim Cooper molto utile, l'ho usata per creare un metodo che accetta una serie di posizioni e fa l'inserimento su tutte, quindi ecco:

EDIT: Sembra che la mia vecchia funzione presupponesse che$insertstrfosse solo 1 carattere e che l'array fosse ordinato. Funziona per lunghezza di caratteri arbitraria.

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
Questo non funziona. Il tuo offset presuppone che $ interstr sia lungo solo 1 carattere. È necessario aggiungere l'offset in base alla lunghezza dell'inserto, iniziare con 0 e aggiungere dopo il substr. Inoltre, è necessario ordinare le posizioni da basso ad alto per farlo funzionare. Ho corretto la tua funzione qui, potresti voler modificare il tuo codice: pastebin.com/g9ADpuU4
Matthias S

@MatthiasS grazie, la prossima volta basta modificare o suggerire la modifica, non me ne sono accorto fino a 2 anni dopo
chiliNUT

1

Semplice e un altro modo di risolvere:

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;

}  

forse anche indicare come viene utilizzata la funzione?
Rotimi,

1
function insSubstr($str, $sub, $posStart, $posEnd){
  return mb_substr($str, 0, $posStart) . $sub . mb_substr($str, $posEnd + 1);
}

$posEndnon è necessario. La domanda riguardava l'inserimento della sottostringa dopo la posizione specificata.
Styx,

Sì, ma ho realizzato questa funzione per il mio progetto. dove avevo bisogno in qualche posto di sostituire e in un altro solo inserendo. La mia funzione funziona anche per questa domanda, quindi non riesco a capire perché mi hai meno?
Ivan Ivan,

0

Strane risposte qui! È possibile inserire facilmente stringhe in altre stringhe con sprintf [collegamento alla documentazione]. La funzione è estremamente potente e può gestire anche più elementi e altri tipi di dati.

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

ti dà la stringa

I like green apples.

1
Bello. ma non gestisce un approccio programmatico. Di solito abbiamo 'I like apples.'come variabile. Quindi dobbiamo %sprima inserire nella stringa, che ritorna al problema originale
KeitelDOG,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.