Str_replace para varios elementos

115

Recuerdo haber hecho esto antes, pero no puedo encontrar el código. Utilizo str_replace para reemplazar un carácter como este: str_replace(':', ' ', $string);pero quiero reemplazar todos los siguientes caracteres \/:*?"<>|, sin hacer un str_replace para cada uno.

mismo viejo
fuente
2
¿Quieres reemplazar todos estos caracteres con un espacio?
Libro de Zeus
7
No tema consultar el excelente manual de php.net y revisar la sección de parámetros para ver si lo que desea es posible.
Mike B

Respuestas:

117

str_replace() puede tomar una matriz, por lo que podría hacer:

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

Alternativamente, puede usar preg_replace():

$new_str = preg_replace('~[\\\\/:*?"<>|]~', ' ', $string);
NullUserException
fuente
2
Suponiendo que el OP significó que la barra invertida debería ser reemplazada, ese patrón preg_replace no funcionó para mí. Para que la barra invertida funcione como se esperaba, tuve que usar 4 de ellos (es decir, "\\\\") en el patrón.
GreenMatt
1
Buena respuesta, agregar la respuesta de @dogbert lo haría completo para las personas que no leen el manual y no se dan cuenta de que str_split devuelve una matriz.
Bradmage
¿Cuál es la ventaja de str_replace()over preg_replace()(o viceversa) en el caso del OP?
ludditedev
1
@ludditedev No hay una ventaja real de ninguna manera, es solo una cuestión de preferencia
NullUserException
1
@MadhurBhaiya Cambie la expresión regular a '~[\\+><-]~'(observe dónde -está). El guión ( -) es un metacarácter de expresión regular, por lo que debe escapar o colocarse estratégicamente en la clase de personaje (todo lo que hay dentro []). Vea esta respuesta: stackoverflow.com/a/7604888/396458
NullUserException
179

Me gusta esto:

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

O, en PHP moderno (cualquier cosa desde 5.4 en adelante), el poco menos prolijo:

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

Por ejemplo , si desea reemplazar search1 con replace1 y search2 con replace2, el siguiente código funcionará:

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

// Salida: replace1 replace2

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

Si solo está reemplazando caracteres individuales, debe usar strtr()

Pastillas de explosión
fuente
2
¿Solo caracteres individuales? ¿Cómo?
Jimmy Kane
2

Podría usar preg_replace () . El siguiente ejemplo se puede ejecutar usando la línea de comando php:

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

Salida:

$ s2: "la cadena"

GreenMatt
fuente
Demasiado escape dentro de la clase de personaje. (ver respuesta aceptada)
mickmackusa
0

Tuve una situación en la que tuve que reemplazar las etiquetas HTML con dos resultados de reemplazo 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 rociadores y protección contra incendios", "Instalador de vapor", "Instalador de terrazo, baldosas y mármol",

Tempteh
fuente
0

Supongo que estás cuidando esto:

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

En mi caso de uso, parametricé algunos campos en un documento HTML, y una vez que cargo estos campos, los hago coincidir y los reemplazo usando el método str_replace.

<?php echo str_replace(array("{{client_name}}", "{{client_testing}}"), array('client_company_name', 'test'), 'html_document'); ?>
vistas de datos
fuente