Str_replace pour plusieurs éléments

115

Je me souviens avoir fait cela avant, mais je ne trouve pas le code. J'utilise str_replace pour remplacer un caractère comme ceci: str_replace(':', ' ', $string);mais je veux remplacer tous les caractères suivants \/:*?"<>|, sans faire de str_replace pour chacun.

même ancien
la source
2
vous voulez remplacer tous ces caractères par un espace?
Livre de Zeus
7
N'ayez pas peur de consulter l'excellent manuel de php.net et de consulter la section des paramètres pour voir si ce que vous voulez est possible.
Mike B

Réponses:

117

str_replace() peut prendre un tableau, vous pouvez donc faire:

$new_str = str_replace(str_split('\\/:*?"<>|'), ' ', $string);

Vous pouvez également utiliser preg_replace():

$new_str = preg_replace('~[\\\\/:*?"<>|]~', ' ', $string);
NullUserException
la source
2
En supposant que l'OP signifiait que la barre oblique inverse devait être remplacée, ce modèle preg_replace ne fonctionnait pas pour moi. Pour que la barre oblique inverse fonctionne comme prévu, j'ai dû en utiliser 4 (c'est-à-dire "\\\\") dans le motif.
GreenMatt
1
Bonne réponse, l'ajout de la réponse @dogbert la rendrait complète pour les personnes qui ne lisent pas le manuel et ne réalisent pas que str_split renvoie un tableau.
Bradmage
Quel est l'avantage de str_replace()plus preg_replace()(ou vice-versa) dans le cas du PO?
ludditedev
1
@ludditedev Aucun avantage réel de toute façon, c'est juste une question de préférence
NullUserException
1
@MadhurBhaiya Remplacez l'expression régulière par '~[\\+><-]~'(notez où se -trouve le). Le tiret ( -) est un métacaractère regex, il doit donc s'échapper ou être stratégiquement placé dans la classe de personnage (tout ce qu'il contient []). Voir cette réponse: stackoverflow.com/a/7604888/396458
NullUserException
181

Comme ça:

str_replace(array(':', '\\', '/', '*'), ' ', $string);

Ou, en PHP moderne (à partir de la version 5.4), le moins verbeux:

str_replace([':', '\\', '/', '*'], ' ', $string);
Dogbert
la source
73

Par exemple , si vous souhaitez remplacer search1 par replace1 et search2 par replace2, le code suivant fonctionnera:

print str_replace(
    array("search1","search2"),
    array("replace1", "replace2"),
    "search1 search2"
);

// Sortie: replace1 replace2

Sumoanand
la source
48
str_replace(
    array("search","items"),
    array("replace", "items"),
    $string
);
Marty
la source
6

Si vous ne remplacez que des caractères uniques, vous devez utiliser strtr()

Pilules d'explosion
la source
2
Caractères uniques seulement? Comment venir?
Jimmy Kane
2

Vous pouvez utiliser preg_replace () . L'exemple suivant peut être exécuté en utilisant la ligne de commande php:

<?php
$s1 = "the string \\/:*?\"<>|";
$s2 = preg_replace("^[\\\\/:\*\?\"<>\|]^", " ", $s1) ;
echo "\n\$s2: \"" . $s2 . "\"\n";
?>

Production:

$ s2: "la chaîne"

GreenMatt
la source
Trop d'échappements à l'intérieur de la classe de caractères. (voir la réponse acceptée)
mickmackusa
0

J'ai eu une situation dans laquelle j'ai dû remplacer les balises HTML par deux résultats de remplacement différents.

$trades = "<li>Sprinkler and Fire      Protection Installer</li>
<li>Steamfitter </li>
<li>Terrazzo, Tile and Marble      Setter</li>";

$s1 =  str_replace('<li>', '"', $trades);

$s2 = str_replace('</li>', '",', $s1);

echo $s2;

résultat

"Installateur de gicleurs et de protection incendie", "Steamfitter", "Terrazzo, Tile and Marble Setter",

Tempteh
la source
0

Je suppose que vous vous occupez de ceci:

// example
private const TEMPLATE = __DIR__.'/Resources/{type}_{language}.json';

...

public function templateFor(string $type, string $language): string
{
   return \str_replace(['{type}', '{language}'], [$type, $language], self::TEMPLATE);
}
Erald Karakashi
la source
0

Dans mon cas d'utilisation, j'ai paramétré certains champs dans un document HTML, et une fois que j'ai chargé ces champs, je les associe et les remplace à l'aide de la méthode str_replace.

<?php echo str_replace(array("{{client_name}}", "{{client_testing}}"), array('client_company_name', 'test'), 'html_document'); ?>
vues de données
la source