Say $ d est un chemin de répertoire et je veux m'assurer qu'il commence et se termine exactement par une barre oblique (/). Il peut initialement avoir zéro, une ou plusieurs barres obliques de début et/ou de fin.Un puzzle preg_replace: remplacer zéro ou plus d'un caractère à la fin du sujet
J'ai essayé:
preg_replace('%^/*|/*$', '/', $d);
qui travaille pour la barre oblique, mais à ma grande surprise des rendements deux barres obliques de fuite si $ d a au moins un slash. Si le sujet est, par exemple, 'foo///'
, alors preg_replace() correspond d'abord et remplace les trois barres obliques finales par une barre oblique, puis il correspond à zéro barre oblique à la fin et remplace cela par une barre oblique. (Vous pouvez le vérifier en remplaçant le deuxième argument par '[$0]'
.) Je trouve cela plutôt contre-intuitif. Bien qu'il existe de nombreuses autres façons de résoudre le problème sous-jacent (et j'en ai implémenté une), cela est devenu un casse-tête PCRE: quel modèle (scalaire) dans un seul preg_replace
fait ce travail?
QUESTION ADDITIONNELLE (modifier)
Quelqu'un peut-il expliquer pourquoi ce modèle correspond à la façon dont il le fait à la fin de la chaîne, mais ne se comporte pas de la même au début?
+1 belle explication.Bien que pour moi le comportement du moteur regex n'est toujours pas intuitif dans ce cas. – NikiC
Belle exposition. Merci, Alan. Bien que cela ait du sens quand vous le décrivez, je doute que je sois capable de me souvenir de cela la prochaine fois que quelque chose comme ça arrivera - la chose contre-intuitive. Mais c'est ici pour référence future. –