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.