Str_replace для нескольких элементов

115

Я помню, как делал это раньше, но не могу найти код. Я использую str_replace для замены одного символа следующим образом: str_replace(':', ' ', $string);но я хочу заменить все следующие символы \/:*?"<>|, не выполняя str_replace для каждого.

одного возраста
источник
2
вы хотите заменить все эти символы пробелом?
Book Of Zeus
7
Не бойтесь ссылаться на отличное руководство по php.net и просмотрите раздел параметров, чтобы узнать, возможно ли то, что вы хотите.
Mike B

Ответы:

117

str_replace() может принимать массив, поэтому вы можете:

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

В качестве альтернативы вы можете использовать preg_replace():

$new_str = preg_replace('~[\\\\/:*?"<>|]~', ' ', $string);
NullUserException
источник
2
Предполагая, что OP означал, что необходимо заменить обратную косую черту, этот шаблон preg_replace у меня не работал. Чтобы обратная косая черта работала должным образом, мне пришлось использовать 4 из них (т.е. «\\\\») в шаблоне.
GreenMatt
1
Хороший ответ, добавление ответа @dogbert сделает его полным для людей, которые не читают руководство и не понимают, что str_split возвращает массив.
Bradmage
В чем преимущество str_replace()перед preg_replace()(или наоборот) в случае OP?
ludditedev
1
@ludditedev Никаких реальных преимуществ в любом случае, это просто вопрос предпочтений
NullUserException
1
@MadhurBhaiya Измените регулярное выражение на '~[\\+><-]~'(обратите внимание, где -это). Тире ( -) - это метасимвол регулярного выражения, поэтому его нужно экранировать или стратегически поместить в класс символов (все внутри []). См. Этот ответ: stackoverflow.com/a/7604888/396458
NullUserException
181

Как это:

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

Или, в современном PHP (начиная с 5.4), немного менее многословно:

str_replace([':', '\\', '/', '*'], ' ', $string);
Dogbert
источник
73

Например , если вы хотите заменить search1 на replace1 и search2 на replace2, то следующий код будет работать:

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

// Вывод: replace1 replace2

Sumoanand
источник
48
str_replace(
    array("search","items"),
    array("replace", "items"),
    $string
);
Марти
источник
6

Если вы заменяете только отдельные символы, вам следует использовать strtr()

Таблетки от взрыва
источник
2
Только одиночные символы? Как придешь?
Джимми Кейн
2

Вы можете использовать preg_replace () . Следующий пример можно запустить с помощью командной строки php:

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

Вывод:

$ s2: "строка"

GreenMatt
источник
Слишком много побегов внутри класса персонажей. (см. принятый ответ)
mickmackusa
0

У меня была ситуация, когда мне пришлось заменить теги HTML двумя разными результатами замены.

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

результат

«Установщик спринклерных и противопожарных систем», «Пароуборщик», «Установщик терраццо, плитки и мрамора»,

Tempteh
источник
0

Думаю, вы за этим следите:

// 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);
}
Иральд Каракаши
источник
0

В моем случае использования я параметризовал некоторые поля в документе HTML, и после загрузки этих полей я сопоставляю и заменяю их с помощью метода str_replace.

<?php echo str_replace(array("{{client_name}}", "{{client_testing}}"), array('client_company_name', 'test'), 'html_document'); ?>
просмотры данных
источник