2010-09-08 6 views
0

salut je veux remplacer tous "e" dans une chaîne avec "-" qui ne suivent pas une barre oblique inverse donc "bonjour" devrait être -> "h-llo" mais "h \ ello" devrait être "bonjour" des idées si cela est possible avec une seule regex?php: comment remplacer une lettre ne pas suivre une barre oblique inverse

+0

Que devrait ' "h \ avant"' regarder comme après avoir été remplacé (un 'e' a un backslash mais l'autre ne le fait pas)? Devrait-il devenir "her-" '? – BoltClock

Répondre

5

Il est impossible d'utiliser le drapeau e si vous avez besoin de combiner les deux expressions rationnelles puisque le remplacement est différent.

preg_replace('/(\\\\?e)/e', "'\\1'=='e'?'-':'e'", $str); 

(Utilisation: http://www.ideone.com/S2uiS)

Il n'y a pas besoin d'utiliser regex bien. The strtr function est capable d'effectuer ce genre de remplacement.

strtr($str, array('\\e' => 'e', 'e' => '-')); 

(Utilisation: http://www.ideone.com/yg93g)

+0

+1 pour 'strtr'. –

+0

Donnerait un autre +1 à 'strtr()' si je le pouvais. – BoltClock

3

Vous pouvez utiliser un negative lookbehind pour assurer que le caractère avant e n'est pas une barre oblique inverse:

$string = preg_replace('/(?<!\\)e/', "-", $string); 
+0

thx pour votre réponse rapide! il y avait une erreur lancée par php je l'ai changé en preg_replace ('/ (? "test". Je sais que je peux le faire dans une seconde fonction de remplacement. mais est-il possible de l'intégrer dans votre regex? – lhwparis

+0

Non, vous avez besoin d'une seconde opération de remplacement pour cela. –

+2

Vous n'avez même pas besoin d'une seconde regex pour cela, utilisez juste 'str_replace ('\\', '', $ your_string)' –

Questions connexes