Str_replace para vários itens

115

Lembro-me de ter feito isso antes, mas não consigo encontrar o código. Eu uso str_replace para substituir um caractere como este: str_replace(':', ' ', $string);mas quero substituir todos os caracteres a seguir \/:*?"<>|, sem fazer um str_replace para cada um.

o mesmo de sempre
fonte
2
você quer substituir todos esses caracteres por um espaço?
Livro de Zeus
7
Não tenha medo de consultar o excelente manual do php.net e revisar a seção de parâmetros para ver se o que você deseja é possível.
Mike B

Respostas:

117

str_replace() pode pegar uma matriz, então você pode fazer:

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

Alternativamente, você pode usar preg_replace():

$new_str = preg_replace('~[\\\\/:*?"<>|]~', ' ', $string);
NullUserException
fonte
2
Supondo que o OP significa que a barra invertida deve ser substituída, esse padrão preg_replace não funcionou para mim. Para fazer a barra invertida funcionar conforme o esperado, tive que usar 4 deles (ou seja, "\\\\") no padrão.
GreenMatt
1
Boa resposta, adicionar @dogbert answer o tornaria completo para as pessoas que não lêem o manual e não percebem que str_split retorna um array.
Bradmage
Qual é a vantagem de str_replace()mais preg_replace()(ou vice-versa) no caso do OP?
ludditedev
1
@ludditedev Nenhuma vantagem real de qualquer maneira, é apenas uma questão de preferência
NullUserException
1
@MadhurBhaiya Altere o regex para '~[\\+><-]~'(observe onde -está). O traço ( -) é um metacaractere regex, portanto, ele precisa escapar ou ser colocado estrategicamente na classe de caractere (tudo dentro []). Veja esta resposta: stackoverflow.com/a/7604888/396458
NullUserException
181

Como isso:

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

Ou, no PHP moderno (qualquer coisa a partir de 5.4), o um pouco menos prolixo:

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

Por exemplo , se você deseja substituir search1 por replace1 e search2 por replace2, o código a seguir funcionará:

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

// Resultado: replace1 replace2

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

Se você estiver substituindo apenas caracteres únicos, deve usar strtr()

Pílulas de explosão
fonte
2
Apenas personagens únicos? Por quê?
Jimmy Kane
2

Você pode usar preg_replace () . O exemplo a seguir pode ser executado usando linha de comando php:

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

Resultado:

$ s2: "a string"

GreenMatt
fonte
Muito escapando dentro da classe de personagem. (ver resposta aceita)
mickmackusa
0

Tive uma situação em que tive que substituir as tags HTML por dois resultados de substituição diferentes.

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

resultado

"Instalador de sprinkler e proteção contra incêndio", "Steamfitter", "Terrazzo, Tile and Marble Setter",

Tempteh
fonte
0

Acho que você está cuidando disso:

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

No meu caso de uso, eu parametrizei alguns campos em um documento HTML e, uma vez que carrego esses campos, faço a correspondência e substituo usando o método str_replace.

<?php echo str_replace(array("{{client_name}}", "{{client_testing}}"), array('client_company_name', 'test'), 'html_document'); ?>
visualizações de dados
fonte