Str_replace für mehrere Elemente

114

Ich erinnere mich, dass ich das schon einmal gemacht habe, kann aber den Code nicht finden. Ich benutze str_replace, um ein Zeichen wie folgt zu ersetzen: str_replace(':', ' ', $string);aber ich möchte alle folgenden Zeichen ersetzen \/:*?"<>|, ohne für jedes ein str_replace zu machen.

gleichalt
quelle
2
Sie möchten alle diese Zeichen durch ein Leerzeichen ersetzen?
Buch des Zeus
7
Haben Sie keine Angst, auf das ausgezeichnete php.net-Handbuch zu verweisen und den Abschnitt params zu lesen , um festzustellen , ob das, was Sie wollen, möglich ist.
Mike B

Antworten:

117

str_replace() kann ein Array nehmen, also könnten Sie tun:

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

Alternativ können Sie verwenden preg_replace():

$new_str = preg_replace('~[\\\\/:*?"<>|]~', ' ', $string);
NullUserException
quelle
2
Angenommen, das OP bedeutete, dass der Backslash ersetzt werden sollte, dann funktionierte das Muster preg_replace bei mir nicht. Damit der Backslash wie erwartet funktioniert, musste ich 4 davon (dh "\\\\") im Muster verwenden.
GreenMatt
1
Eine gute Antwort, das Hinzufügen der @ dogbert-Antwort in würde es für die Leute vervollständigen, die das Handbuch nicht lesen und nicht erkennen, dass str_split ein Array zurückgibt.
Bradmage
Was ist der Vorteil von str_replace()gegenüber preg_replace()(oder umgekehrt) im Fall des OP?
ludditedev
1
@ludditedev Kein wirklicher Vorteil so oder so, es ist nur eine Frage der Präferenz
NullUserException
1
@MadhurBhaiya Ändern Sie die Regex in '~[\\+><-]~'(beachten Sie, wo die -ist). Der Strich ( -) ist ein Regex-Metazeichen, daher muss er maskiert oder strategisch in die Zeichenklasse eingefügt werden (alles darin []). Siehe diese Antwort: stackoverflow.com/a/7604888/396458
NullUserException
178

So was:

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

Oder in modernem PHP (ab 5.4) etwas weniger wortreich:

str_replace([':', '\\', '/', '*'], ' ', $string);
Dogbert
quelle
71

Wenn Sie beispielsweise search1 durch replace1 und search2 durch replace2 ersetzen möchten, funktioniert der folgende Code:

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

// Ausgabe: replace1 replace2

Sumoanand
quelle
47
str_replace(
    array("search","items"),
    array("replace", "items"),
    $string
);
Marty
quelle
6

Wenn Sie nur einzelne Zeichen ersetzen, sollten Sie verwenden strtr()

Explosionspillen
quelle
2
Nur einzelne Zeichen? Woher?
Jimmy Kane
2

Sie könnten preg_replace () verwenden . Das folgende Beispiel kann mit der Befehlszeile PHP ausgeführt werden:

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

Ausgabe:

$ s2: "der String"

GreenMatt
quelle
Es entweicht zu viel innerhalb der Charakterklasse. (siehe akzeptierte Antwort)
Mickmackusa
0

Ich hatte eine Situation, in der ich die HTML-Tags durch zwei verschiedene Ersetzungsergebnisse ersetzen musste.

$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;

Ergebnis

"Sprinkler- und Brandschutzinstallateur", "Steamfitter", "Terrazzo-, Fliesen- und Marmorsetzer",

Tempteh
quelle
0

Ich denke, Sie kümmern sich darum:

// 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
quelle
0

In meinem Anwendungsfall habe ich einige Felder in einem HTML-Dokument parametrisiert. Sobald ich diese Felder geladen habe, stimme ich mit der Methode str_replace überein und ersetze sie.

<?php echo str_replace(array("{{client_name}}", "{{client_testing}}"), array('client_company_name', 'test'), 'html_document'); ?>
Datenansichten
quelle