2010-10-19 6 views
2

Je sais qu'il y a un si/alors dans la correspondance des expressions régulières, mais y en a-t-il une dans le remplacement?preg_replace remplacement conditionnel avec une chaîne différente

ie. Je veux faire dans un regex

"J'ai Foo bars à moins de 5 $ à la vente" pour être "Bars Foo ~ 5 $"

"J'ai Foo Bars à vendre" pour devenir "Foo Bars" et NON "Bars Foo ~"

J'ai une expression un peu comme celui-ci au moment:

preg_replace("/(([A-Z][a-z]*\s){1,3})((under .)\d+)?/","$1~$4",$str); 

(avec d'autres bits pour enlever l'autre aswell texte bien sûr!) mais tha t inclut le ~ même quand il n'y a pas de "dessous" dedans.

Je pourrais probablement utiliser preg_replace_callback mais qui semble un peu OTT

Merci.

+0

Pourquoi ne pas comparer les chaînes en PHP ont alors différentes expressions de preg_replace pour eux? Je ne comprends pas pourquoi vous cherchez une façon compliquée de résoudre une solution simple. – theAlexPoon

+0

Oui, dans mon exemple, je pourrais le faire, mais ce que j'essaie de faire consiste à analyser une page de texte et j'aimerais bien la faire dans une expression rationnelle si possible – Vortigern

Répondre

2

fonction de garniture de Php ferait:

// Before: "Foo Bars~$5" 
    $str = trim($str,'~'); 
// After: "Foo Bars~$5" 

// Before: "Foo Bars~" 
$str = trim($str,'~'); 
// After: "Foo Bars" 
Questions connexes