Comment supprimer une partie d'une chaîne? [fermé]

152

Comment puis-je supprimer une partie d'une chaîne?

Exemple de chaîne: "REGISTER 11223344 here"

Comment puis-je supprimer "11223344"de l'exemple de chaîne ci-dessus?

siddharth
la source
Votre question n'est pas claire / ambiguë. Vous utilisez le terme remove, mais il semble probable que vous vouliez extractque la chaîne ciblée puisse être stockée dans la base de données.
mickmackusa le
@Makyen Je suis convaincu que vous avez vandalisé la question pour que bon nombre des réponses soient correctes. Pensez-y: pourquoi l'OP voudrait-il enregistrer REGISTER heredans la base de données?
mickmackusa le
2
@mickmackusa remove peut être synonyme de take away from, c'est-à-dire en retirant 11223344 de la chaîne, je ne vois pas le problème ici. Au pire, c'est ambigu, ce n'est certainement pas "vandalisé"
Nick
Lisez la (les) version (s) pré-vandalisée (s). @Nick stackoverflow.com/posts/2192170/revisions La vérité changera d'avis. Je serais heureux de voir cette question close comme peu claire.
mickmackusa le
2
@mickmackusa je l'ai fait ... Je ne comprends pas votre point. Si vous avez un si gros problème avec la façon dont il est écrit, pourquoi ne pas le résoudre vous
Nick

Réponses:

220

Si vous ciblez spécifiquement "11223344", utilisez str_replace:

// str_replace($search, $replace, $subject)
echo str_replace("11223344", "","REGISTER 11223344 here");
Dominic Rodger
la source
4
str_replace ($ search, $ replace, $ subject)
drooh
119

Vous pouvez utiliser str_replace () , qui est défini comme:

str_replace($search, $replace, $subject)

Vous pouvez donc écrire le code comme suit:

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

Si vous avez besoin d'une meilleure correspondance via des expressions régulières, vous pouvez utiliser preg_replace () .

Dhorat
la source
2
Si l'on a besoin d'une correspondance régulière, il y a aussi preg_replace () us2.php.net/manual/en/function.preg-replace.php
Elijah Lynn
4
Je ne sais pas pourquoi cette réponse a été publiée, c'est un double plus long de la réponse de Dominic et un double plus court de la réponse de Roland ...
CPHPython
23

en supposant que 11223344 n'est pas constant

$string="REGISTER 11223344 here";
$s = explode(" ",$string);
unset($s[1]);
$s = implode(" ",$s);
print "$s\n";
ghostdog74
la source
10
str_replace(find, replace, string, count)
  • find Obligatoire. Spécifie la valeur à rechercher
  • remplacer Obligatoire. Spécifie la valeur pour remplacer la valeur dans find
  • string Obligatoire. Spécifie la chaîne à rechercher
  • count Facultatif. Une variable qui compte le nombre de remplacements

Comme par exemple 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"
Stnfordly
la source
1
Comment proposez-vous que l'OP utilise ce pseudo code?
mickmackusa
6

Lorsque vous avez besoin d'une correspondance basée sur des règles, vous devez utiliser regex

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

Cela correspondra au premier ensemble de nombres, donc si vous avez besoin d'être plus précis, essayez:

$string = "REGISTER 11223344 here";
preg_match("/REGISTER (\d+) here/", $string, $match);
$number = $match[1];
TravisO
la source
preg_replace () serait beaucoup plus facile n'est-ce pas? us2.php.net/manual/en/function.preg-replace.php
Elijah Lynn
1
@ElijahLynn replace vous oblige à supprimer des éléments, les modifications futures ou le bruit se briseraient. Faire cela via _replace mais _match continuerait à fonctionner.
TravisO
@TravisO eh bien oui, mais non. Ces deux fonctions sont presque les mêmes en ce qui concerne la mise en œuvre des fonctions, et les chances que les changements futurs affectent l'une d'entre elles sont les mêmes . Il existe la même possibilité de modifications futures sur _match uniquement, ce qui rend cette utilisation invalide et _replace fonctionne toujours correctement. En outre, la gestion des versions est généralement très attentive à ne pas freiner les fonctionnalités précédentes, si possible.
CT.
Vous n'avez pas besoin d'un groupe de capture ici. En fait, l'utilisation du groupe de capture gonfle inutilement le $matchtableau. Retirez les parenthèses puis accédez via $match[0].
mickmackusa
5

substr () est une fonction php intégrée qui renvoie une partie d'une chaîne. La fonction substr () prendra une chaîne comme entrée, la forme d'index où vous voulez que la chaîne soit coupée. et un paramètre facultatif est la longueur de la sous-chaîne. Vous pouvez voir la documentation appropriée et un exemple de code sur http://php.net/manual/en/function.substr.php

REMARQUE: l'index d'une chaîne commence par 0.

Umair Jabbar
la source
Comment proposez-vous que le PO utilise votre indice général pour atteindre le résultat souhaité?
mickmackusa
Je trouve que cette réponse est vague et de faible valeur.
mickmackusa
1

Dynamiquement, si vous souhaitez supprimer (une) partie (s) d'un (des) index (s) fixe (s) d'une chaîne, utilisez cette fonction:

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

Pour votre objectif:

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

L'une de ses utilisations est d'exécuter des chaînes de type commande, dont vous connaissez leurs structures.

MAChitgarha
la source
1
Ghostdog a déjà suggéré une technique d'explosion-implosion, mais je ne peux pas imaginer divertir une technique aussi longue pour une opération aussi basique.
mickmackusa le
0

L'extrait suivant imprimera «INSCRIVEZ-VOUS ici»

$string = "REGISTER 11223344 here";

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

print_r($result);

L'API preg_replace () nous utilise comme indiqué ci-dessous.

$result = preg_replace(
    array('/pattern1/', '/pattern2/'),
    array('replace1', 'replace2'),
    $input_string
);
arango_86
la source
Il n'y a absolument aucune raison de passer des tableaux à preg_replace()dans ce cas. Il n'y a aucun avantage non plus à utiliser un groupe de capture.
mickmackusa le
Je suis d'accord. Array est ajouté juste pour plus de commodité. Cela peut être négligé. cela ne fera aucun mal. Ajout d'un groupe de capture pour exclure les nombres. Cela fonctionne selon la question tracée. Et d'autres modifications et ajustements peuvent être effectués en fonction des individus.
arango_86
Mon point est qu'il y a des inclusions inutiles dans votre extrait de code qui n'ont aucun sens à inclure.
mickmackusa le
-1

Faites ce qui suit

$string = 'REGISTER 11223344 here';

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

Cela renverrait "INSCRIPTION ici"

ou

$string = 'REGISTER 11223344 here';

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

Cela renverrait "INSCRIVEZ-VOUS ici"

Elitmiar
la source
4
Ne renverrait-il pas "REGISTER__here", avec deux blancs (pensez aux traits de soulignement comme des espaces, le commentaire ne me permettra pas deux espaces suivants)? Beacuse des espaces avant et après le "(. *)".
TechNyquist
6
Cette réponse est AU MOINS 100% fausse. Preuve: 3v4l.org/LDLEM pourquoi cette réponse a 15 UVs?
mickmackusa le