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.


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

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

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


48
str_replace(
    array("search","items"),
    array("replace", "items"),
    $string
);


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"


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",


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

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'); ?>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.