Come rimuovere parte di una stringa? [chiuso]


152

Come posso rimuovere parte di una stringa?

Stringa di esempio: "REGISTER 11223344 here"

Come posso rimuovere "11223344"dalla stringa di esempio sopra?


La tua domanda è poco chiara / ambigua. Stai usando il termine remove, ma sembra probabile che intendi in extractmodo che la stringa di destinazione possa essere archiviata nel database.
mickmackusa,

@Makyen Sono abbastanza fiducioso che tu abbia vandalizzato la domanda per rendere corrette molte delle risposte. Pensaci: perché l'OP vorrebbe salvare REGISTER herenel database?
Mickmackusa,

2
La rimozione di @mickmackusa può essere sinonimo di take away, ovvero togliendo 11223344 dalla stringa, non riesco a vedere il problema qui. Nel peggiore dei casi è ambiguo, non è certamente "vandalizzato"
Nick,

Leggi le versioni pre-vandalizzate. @ Nick stackoverflow.com/posts/2192170/revisions La verità farà cambiare idea. Sarei felice di vedere questa domanda chiusa come poco chiara.
Mickmackusa,

2
@mickmackusa l'ho fatto ... non riesco a vedere il tuo punto. Se hai un grosso problema con il modo in cui è scritto, perché non risolverlo da solo
Nick,

Risposte:


220

Se scegli come target specifico "11223344", utilizza str_replace:

// str_replace($search, $replace, $subject)
echo str_replace("11223344", "","REGISTER 11223344 here");

4
str_replace ($ cerca, $ sostituisci, $ soggetto)
drooh

119

Puoi usare str_replace () , che è definito come:

str_replace($search, $replace, $subject)

Quindi potresti scrivere il codice come:

$subject = 'REGISTER 11223344 here' ;
$search = '11223344' ;
$trimmed = str_replace($search, '', $subject) ;
echo $trimmed ;

Se hai bisogno di una migliore corrispondenza tramite espressioni regolari puoi usare preg_replace () .


2
Se uno ha bisogno di regex matching c'è anche preg_replace () us2.php.net/manual/en/function.preg-replace.php
Elijah Lynn

4
Non sono sicuro del perché questa risposta sia stata pubblicata, è un duplicato più lungo della risposta di Dominic e un duplicato più breve della risposta di Roland ...
CPHPython

23

supponendo che 11223344 non sia costante

$string="REGISTER 11223344 here";
$s = explode(" ",$string);
unset($s[1]);
$s = implode(" ",$s);
print "$s\n";

10
str_replace(find, replace, string, count)
  • trova Obbligatorio. Specifica il valore da trovare
  • sostituire Obbligatorio. Specifica il valore per sostituire il valore in find
  • stringa obbligatoria. Specifica la stringa da cercare
  • conteggio facoltativo. Una variabile che conta il numero di sostituzioni

Come da esempio OP:

$Example_string = "REGISTER 11223344 here";
$Example_string_PART_REMOVED = str_replace('11223344', '', $Example_string);

// will leave you with "REGISTER  here"

// finally - clean up potential double spaces, beginning spaces or end spaces that may have resulted from removing the unwanted string
$Example_string_COMPLETED = trim(str_replace('  ', ' ', $Example_string_PART_REMOVED));
// trim() will remove any potential leading and trailing spaces - the additional 'str_replace()' will remove any potential double spaces

// will leave you with "REGISTER here"

1
Come proponete che l'OP utilizzi questo pseudo codice?
Mickmackusa,

6

Quando è necessaria la corrispondenza basata su regole, è necessario utilizzare regex

$string = "REGISTER 11223344 here";
preg_match("/(\d+)/", $string, $match);
$number = $match[1];

Che corrisponderà al primo set di numeri, quindi se devi essere più specifico prova:

$string = "REGISTER 11223344 here";
preg_match("/REGISTER (\d+) here/", $string, $match);
$number = $match[1];

preg_replace () sarebbe molto più semplice, no? us2.php.net/manual/en/function.preg-replace.php
Elijah Lynn

1
@ElijahLynn sostituzione richiede di rimuovere le cose, i cambiamenti futuri o il rumore si romperanno. In questo modo tramite _replace ma _match continuerebbe a funzionare.
TravisO,

@TravisO bene sì, ma no. Queste due sono quasi le stesse funzioni di implementazione saggia, e le probabilità che i futuri cambiamenti influenzino una di esse sono le stesse . Esiste la stessa possibilità di future modifiche solo su _match, rendendo questo uso non valido e _replace funziona ancora bene. Inoltre, il controllo delle versioni di solito è molto attento a non frenare le funzionalità precedenti, se possibile.
CT.

Non è necessario un gruppo di acquisizione qui. In effetti, l'utilizzo del gruppo di acquisizione gonfia inutilmente l' $matcharray. Rimuovere le parentesi quindi accedere tramite $match[0].
Mickmackusa,

5

substr () è una funzione php incorporata che restituisce parte di una stringa. La funzione substr () prenderà una stringa come input, la forma dell'indice in cui si desidera tagliare la stringa. e un parametro opzionale è la lunghezza della sottostringa. Puoi vedere la documentazione corretta e il codice di esempio su http://php.net/manual/en/function.substr.php

NOTA: l'indice per una stringa inizia con 0.


In che modo proponi che il PO utilizzi il tuo suggerimento generale per ottenere il risultato desiderato?
Mickmackusa,

Trovo che questa risposta sia vaga e di scarso valore.
Mickmackusa,

1

In modo dinamico, se si desidera rimuovere (a) parti da (a) indici fissi di una stringa, utilizzare questa funzione:

/**
 * Removes index/indexes from a string, using a delimiter.
 * 
 * @param string $string
 * @param int|int[] $index An index, or a list of indexes to be removed from string.
 * @param string $delimiter 
 * @return string
 * @todo Note: For PHP versions lower than 7.0, remove scalar type hints (i.e. the
 * types before each argument) and the return type.
 */
function removeFromString(string $string, $index, string $delimiter = " "): string
{
    $stringParts = explode($delimiter, $string);

    // Remove indexes from string parts
    if (is_array($index)) {
        foreach ($index as $i) {
            unset($stringParts[(int)($i)]);
        }
    } else {
        unset($stringParts[(int)($index)]);
    }

    // Join all parts together and return it
    return implode($delimiter, $stringParts);
}

Per il tuo scopo:

remove_from_str("REGISTER 11223344 here", 1); // Output: REGISTER here

Uno dei suoi usi è quello di eseguire stringhe simili a comandi, che conosci le loro strutture.


1
Ghostdog ha già suggerito una tecnica di esplodere, ma non riesco a immaginare di intrattenere una tecnica così lungimirante per un'operazione così basilare.
mickmackusa,

0

Il frammento seguente stamperà "REGISTRA qui"

$string = "REGISTER 11223344 here";

$result = preg_replace(
   array('/(\d+)/'),
   array(''),
   $string
);

print_r($result);

L'API preg_replace () ci utilizza come indicato di seguito.

$result = preg_replace(
    array('/pattern1/', '/pattern2/'),
    array('replace1', 'replace2'),
    $input_string
);

In preg_replace()questo caso non vi è assolutamente motivo di passare array . Né vi è alcun vantaggio nell'utilizzare un gruppo di acquisizione.
mickmackusa,

Sono d'accordo. L'array viene aggiunto solo per comodità. Può essere trascurato. non farà alcun male. Aggiunto gruppo di acquisizione per escludere i numeri. Questo funziona secondo la domanda tracciata. E ulteriori modifiche e messa a punto possono essere fatte in base agli individui.
arango_86

Il punto è che ci sono inclusioni inutili nel tuo frammento che non ha senso includere.
Mickmackusa,

-1

Eseguire le seguenti operazioni

$string = 'REGISTER 11223344 here';

$content = preg_replace('/REGISTER(.*)here/','',$string);

Ciò restituirebbe "REGISTRATIqui"

o

$string = 'REGISTER 11223344 here';

$content = preg_replace('/REGISTER (.*) here/','',$string);

Ciò restituirebbe "REGISTRATI qui"


4
Non restituirebbe "REGISTER__here", con due spazi vuoti (pensa che il trattino basso come spazi, il commento non mi permetterà due spazi successivi)? Perché gli spazi prima e dopo il "(. *)".
TechNyquist,

6
Questa risposta è ALMENO AL 100% errata. Prova: 3v4l.org/LDLEM perché questa risposta ha 15 UV?
Mickmackusa,
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.