Comment puis-je remplacer une certaine partie de ma chaîne par une autre?
Chaîne d'entrée:
"Hello my name is Santa"
Comment puis-je changer tous les a
s de ma chaîne avec autre chose?
Je pense que j'ai besoin d'une boucle foreach
, mais je ne sais pas comment l'utiliser.
strtr ($str, array ('a' => '<replacement>'));
METTRE &AGRAVE; JOUR:
strtr ("hello my name is santa", array ('a' => '<replacement>'));
Pour répondre à votre question plus précisément.
Il existe quelques fonctions/méthodes différentes pour remplacer une certaine partie d'une chaîne par quelque chose d'autre, chacun avec ses propres avantages.
str_replace()
méthode (coffre-fort binaire; sensible à la casse)Arguments
str_replace mixte (mixte $ recherche , mixte $ remplacer , mixte $ subject [ int & $ count])
str_replace()
a 3 arguments obligatoires, comme vous pouvez le voir dans la définition ci-dessus avec le bon ordre, qui peuvent tous prendre une chaîne comme un tableau comme argument!
Rechercher et remplacer
search(string) AND replace(string) → Remplace la chaîne de recherche par la chaîne de remplacement.
search(array) AND replace(string) → Remplace tous les éléments de recherche par la chaîne de remplacement.
search(string) AND replace(array) → Vous jette un avis: "Avis: Conversion de tableau en chaîne", car un tableau de remplacement pour une seule chaîne de recherche n'a pas de sens, il tente de convertir le tableau en un string.
search(array) AND replace(array) → Remplace chaque élément de recherche par l'élément de remplacement correspondant (les clés sont ignorées!).
search(more elements) AND replace(less elements) → Remplace chaque élément de recherche par l'élément de remplacement correspondant (une chaîne vide sera utilisée pour les éléments de remplacement manquants).
search(less elements) AND replace(more elements) → Remplace chaque élément de recherche par l'élément de remplacement correspondant (les éléments de remplacement inutiles sont ignorés).
Sujet
subject(string) → Le remplacement est effectué pour la chaîne de sujet.
subject(array) → Le remplacement est effectué pour chaque élément du tableau.
Code
echo str_replace("search", "replace", "text search text");
echo str_replace(["t", "a"], "X", "text search text");
echo str_replace("search", ["replace1", "replace2"], "text search text");
echo str_replace(["a", "c"], ["X", "Y"], "text search text");
Sortie
text replace text
XexX seXrch XexX
Notice: Array to string conversion
text seXrYh text
Notes
Je t'ai eu!
Il est important de savoir que str_replace()
fonctionne de gauche à droite du tableau. Cela signifie qu'il est possible de remplacer une valeur que vous avez déjà remplacée. Par exemple:
echo str_replace(array("a", "b"), array("b", "c"), "aabb");
//Probably expected output: bbcc
//Actual output: cccc
Insensible à la casse
Si vous souhaitez rendre la recherche insensible à la casse, vous pouvez utiliser str_ireplace()
(Notez le i
pour le cas - i nsensitive).
Tableau multidimensionnel
str_replace()
/str_ireplace()
NE fonctionne PAS pour les tableaux multidimensionnels. Voir ceci commentaire du manuel pour une telle implémentation. Bien sûr, vous pouvez également remplacer str_replace()
par str_ireplace()
pour tenir compte de la casse.
Si vous voulez tout mettre en place et créer une fonction qui fonctionne également pour les tableaux multidimensionnels insensibles à la casse, vous pouvez procéder de la manière suivante:
<?php
function str_ireplace_deep($search, $replace, $subject)
{
if (is_array($subject))
{
foreach($subject as &$oneSubject)
$oneSubject = str_ireplace_deep($search, $replace, $oneSubject);
unset($oneSubject);
return $subject;
} else {
return str_ireplace($search, $replace, $subject);
}
}
?>
strtr()
méthode (50% de sécurité binaire; sensible à la casse)Arguments
chaîne strtr (chaîne $ str , chaîne $ de , chaîne $ to )
chaîne strtr (chaîne $ str , tableau $ replace_pairs )
La fonction prend 3 arguments avec une chaîne from et to ou 2 arguments avec un tableau de remplacement array("search" => "replace" /* , ... */)
, que vous pouvez tous voir dans la définition ci-dessus avec le bon ordre.
2 arguments
Il commence à remplacer la clé la plus longue par la valeur correspondante et le fait jusqu'à ce qu'il remplace toutes les paires key => value
. Dans ce cas, la fonction est sécurisée binaire, car elle utilise la clé/valeur entière.
3 arguments
Il remplace l'argument from par l'argument to dans subject octet par octet . Donc ce n'est pas binaire en sécurité!
Si les arguments from et to sont de longueur inégale, le remplacement s'interrompt lorsqu'il atteint la fin de la chaîne la plus courte.
Sujet
Il n'accepte pas un tableau en tant que sujet, mais simplement une chaîne.
Code
echo strtr("text search text", "ax", "XY");;
echo strtr("text search text", ["search" => "replace"]);
Sortie
teYt seXrch teYt
text replace text
Notes
Je t'ai eu!
Opposé à str_replace()
, strtr()
ne remplace PAS quelque chose deux fois. Par exemple:
echo strtr("aabb", ["a" => "b", "b" => "c"]);
//Expected output: bbcc
//Actual output: bbcc
De même, si vous souhaitez remplacer plusieurs éléments par la même chaîne, vous pouvez utiliser array_fill_keys()
pour remplir votre tableau de remplacement avec la valeur.
Insensible à la casse
strtr()
N'EST PAS sensible à la casse NOR existe-t-il une fonction équivalente ne respectant pas la casse. Voir ceci commentaire du manuel pour une implémentation insensible à la casse.
Tableau multidimensionnel
strtr()
s'oppose à str_replace()
NE fonctionne PAS avec les tableaux en tant que sujet. Par conséquent, il ne fonctionne PAS avec les tableaux multidimensionnels. Vous pouvez bien sûr utiliser le code ci-dessus à partir de str_replace()
pour les tableaux multidimensionnels et l'utiliser simplement avec strtr()
ou avec l'implémentation de stritr()
.
Si vous voulez tout mettre en place et créer une fonction qui fonctionne également pour les tableaux multidimensionnels insensibles à la casse, vous pouvez procéder de la manière suivante:
<?php
if(!function_exists("stritr")){
function stritr($string, $one = NULL, $two = NULL){
/*
stritr - case insensitive version of strtr
Author: Alexander Peev
Posted in PHP.NET
*/
if( is_string( $one ) ){
$two = strval( $two );
$one = substr( $one, 0, min( strlen($one), strlen($two) ) );
$two = substr( $two, 0, min( strlen($one), strlen($two) ) );
$product = strtr( $string, ( strtoupper($one) . strtolower($one) ), ( $two . $two ) );
return $product;
}
else if( is_array( $one ) ){
$pos1 = 0;
$product = $string;
while( count( $one ) > 0 ){
$positions = array();
foreach( $one as $from => $to ){
if( ( $pos2 = stripos( $product, $from, $pos1 ) ) === FALSE ){
unset( $one[ $from ] );
}
else{
$positions[ $from ] = $pos2;
}
}
if( count( $one ) <= 0 )break;
$winner = min( $positions );
$key = array_search( $winner, $positions );
$product = ( substr( $product, 0, $winner ) . $one[$key] . substr( $product, ( $winner + strlen($key) ) ) );
$pos1 = ( $winner + strlen( $one[$key] ) );
}
return $product;
}
else{
return $string;
}
}/* endfunction stritr */
}/* endfunction exists stritr */
function stritr_deep($string, $one = NULL, $two = NULL){
if (is_array($string))
{
foreach($string as &$oneSubject)
$oneSubject = stritr($string, $one, $two);
unset($oneSubject);
return $string;
} else {
return stritr($string, $one, $two);
}
}
?>
preg_replace()
méthode (coffre-fort binaire; sensible à la casse)Arguments
preg_replace mixte (mixte $ motif , mixte $ remplacement , mixte $ subject [ int $ limit = -1 [ int & $ count]])
preg_replace()
a 3 paramètres requis dans l'ordre indiqué ci-dessus. Maintenant, tous les 3 peuvent prendre une chaîne comme un tableau comme argument!
Rechercher et remplacer
search(string) AND replace(string) → Remplace toutes les correspondances de l'expression rationnelle de recherche par la chaîne de remplacement.
search(array) AND replace(string) → Remplace toutes les correspondances de chaque expression rationnelle de recherche par la chaîne de remplacement.
search(string) AND replace(array) → Vous lance un avertissement: "Avertissement: preg_replace (): incompatibilité de paramètre, motif est une chaîne alors que le remplacement est un tableau", car un tableau de remplacement pour une seule expression rationnelle de recherche n'a pas de sens.
search(array) AND replace(array) → Remplace toutes les correspondances de chaque expression rationnelle de recherche par l'élément de remplacement correspondant (les clés sont ignorées!).
search(more elements) AND replace(less elements) → Remplace toutes les correspondances de chaque expression rationnelle de recherche par l'élément de remplacement correspondant (une chaîne vide sera utilisée pour les éléments de remplacement manquants).
search(less elements) AND replace(more elements) → Remplace toutes les correspondances de chaque expression rationnelle de recherche par l'élément de remplacement correspondant (les éléments de remplacement inutiles sont ignorés).
Sujet
subject(string) → Le remplacement est effectué pour la chaîne de sujet.
subject(array) → Le remplacement est effectué pour chaque élément du tableau.
Veuillez noter à nouveau: la recherche doit être une expression régulière! Cela signifie qu'il a besoin de délimiteurs et que des caractères spéciaux doivent être échappés.
Code
echo preg_replace("/search/", "replace", "text search text");
echo preg_replace(["/t/", "/a/"], "X", "text search text");
echo preg_replace("/search/", ["replace1", "replace2"], "text search text");
echo preg_replace(["a", "c"], ["X", "Y"], "text search text");
Sortie
text replace text
XexX seXrch XexX
Warning: preg_replace(): Parameter mismatch, pattern is a string while replacement is an array
text seXrYh text
Notes
Je t'ai eu!
Identique à str_replace()
, preg_replace()
fonctionne de gauche à droite du tableau. Cela signifie qu'il est possible de remplacer une valeur que vous avez déjà remplacée. Par exemple:
echo preg_replace(["/a/", "/b/"], ["b", "c"], "aabb");
//Probably expected output: bbcc
//Actual output: cccc
Insensible à la casse
Puisque l'argument de recherche est une expression régulière, vous pouvez simplement passer le flag i
pour une recherche ne respectant pas la casse.
Tableau multidimensionnel
preg_replace()
ne fonctionne PAS pour les tableaux multidimensionnels.
Référence arrière
Sachez que vous pouvez utiliser \\n
/$n
comme référence arrière pour les groupes de capture de la regex. Où 0
est l'intégralité de la correspondance et 1-99
pour vos groupes de capture.
De plus, si la référence est immédiatement suivie d'un numéro, vous devez utiliser \${n}
.
Replacement/"Le modificateur/e est obsolète"
Le remplacement dans preg_replace()
ne peut pas utiliser les fonctions de rappel comme remplacement. Vous devez donc utiliser preg_replace_callback()
. Idem quand vous utilisez le modificateur e
et obtenez "Déconseillé: preg_replace (): le modificateur/e est déconseillé, utilisez plutôt preg_replace_callback". Voir: Remplacez preg_replace () e modificateur par preg_replace_callback
Si vous voulez tout mettre en place et créer une fonction qui fonctionne également pour les tableaux multidimensionnels insensibles à la casse, vous pouvez procéder de la manière suivante:
<?php
function preg_replace_deep($search, $replace, $subject)
{
if (is_array($subject))
{
foreach($subject as &$oneSubject)
$oneSubject = preg_replace_deep($search, $replace, $oneSubject);
unset($oneSubject);
return $subject;
} else {
return preg_replace($search, $replace, $subject);
}
}
?>
while
/ for
/ foreach
méthode (PAS binaire sécurisé; sensible à la casse)Maintenant, bien sûr, en plus de toutes ces fonctions, vous pouvez également utiliser une simple boucle pour parcourir la chaîne et remplacer chaque paire search => replace
que vous avez.
Mais cela devient beaucoup plus complexe lorsque vous le faites en toute sécurité binaire, sans distinction de casse ni pour les tableaux multidimensionnels, au-delà de l’utilisation des fonctions ci-dessus. Je n'inclurai donc aucun exemple ici.
À l'heure actuelle, toutes les méthodes présentées ci-dessus effectuent le remplacement sur toute la chaîne. Mais parfois, vous voulez remplacer quelque chose uniquement pour une certaine partie de votre chaîne.
Pour cela, vous voudrez probablement/pouvez utiliser substr_replace()
. Une autre méthode courante consiste à utiliser substr()
et à appliquer le remplacement uniquement à cette sous-chaîne particulière et à rassembler la chaîne par la suite. Bien sûr, vous pouvez également modifier votre expression rationnelle ou faire autre chose pour ne pas appliquer le remplacement à la chaîne entière.
str_replace est suffisant pour les travaux de remplacement simples (comme le remplacement d'une seule lettre), mais l'utilisation de preg_replace est généralement recommandée (si vous voulez quelque chose de plus flexible ou polyvalent), car il est flexible et polyvalent. Et comme le "a" n'est qu'un exemple ...:
$String = preg_replace('/<string>/','<replacement>',$String);
Ou si vous voulez plusieurs remplacements à la fois:
$String = preg_replace(array('/<string 1>/','/<string 2>/'),array('<replacement 1>','<replacement 2>'),$String);
preg_replace peut malheureusement être assez difficile à utiliser. Je recommande les lectures suivantes: http://php.net/manual/fr/function.preg-replace.php Http: //www.phpro.org/tutorials/Introduction-to -PHP-Regex.html
De même, si vous décidez d'utiliser str_replace () et que votre remplaçant doit tenir compte de la casse, vous aurez besoin de str_ireplace ().
cela peut aussi fonctionner sans fonctions php str changer ici votre caractère "a" et "et commercial":
for ($i=0; $i<strlen($str); $i++){
if ($str[$i]=='a'){
$str[$i]='&';
}
}
echo $str;
Utilise la fonction preg_replace ()
$text ='this is Old Word';
echo $text;
echo '<br>';
$text = preg_replace('/\bOld Word\b/', 'NEW Word', $text);
echo $text;