web-dev-qa-db-fra.com

preg_replace comment remplacer uniquement le motif xxx ($ 1) yyy correspondant dans le sélecteur

J'essaie d'utiliser une expression régulière pour effacer uniquement la partie correspondante d'une chaîne. J'utilise le preg_replace et ont essayé de supprimer le texte correspondant en mettant des parenthèses autour de la partie correspondante. Exemple:

preg_replace('/text1(text2)text3/is','',$html);

Cela remplace cependant la chaîne entière par ''. Je veux seulement effacer text2, mais laisser text1 et text3 intacts. Comment puis-je faire correspondre et remplacer uniquement la partie de la chaîne qui correspond?

31
PartySoft

Il existe une alternative à l'utilisation de text1 et text3 dans le modèle de correspondance, puis les remettre via la chaîne de remplacement. Vous pouvez utiliser les assertions comme ceci:

preg_replace('/(?<=text1)(text2)(?=text3)/', "", $txt);

De cette façon, l'expression régulière recherche juste la présence -, mais ne prend pas en compte les deux chaînes lors de l'application du remplacement.

http://www.regular-expressions.info/lookaround.html pour plus d'informations.

41
mario

Utilisez références arrières (c'est-à-dire les crochets) pour ne conserver que les parties de l'expression dont vous souhaitez vous souvenir. Vous pouvez rappeler le contenu de la chaîne de remplacement en utilisant $1, $2, etc.:

preg_replace('/(text1)text2(text3)/is','$1$2',$html);
36
Mansoor Siddiqui

Essaye ça:

$text = preg_replace("'(text1)text2(text3)'is", "$1$2", $text);

Esperons que ça marche!

Modifier: changé \\1\\2 à $1$2 qui est la méthode recommandée.

13
aorcsik