coldfusion
Travailler avec RegExp Remplacer les rappels
Recherche…
Introduction
Si vous voulez plus qu'un simple remplacement de chaîne par des expressions régulières courantes, vous rencontrerez certainement des problèmes et vous heurterez au mur lorsque vous découvrirez les limites des fonctions regex utilisées par Coldfusion. Il n'y a pas de fonction intégrée telle que preg_replace_callback de php.
Paramètres
| Paramètre | Détails |
|---|---|
re | L'expression régulière |
str | La chaîne à appliquer à la regex |
callback | La fonction où le groupe capturé sera transmis si une correspondance a été trouvée. Là les allumettes peuvent être traitées |
Remarques
Parce que Coldfusion lui-même ne propose pas ce que nous voulons, nous faisons appel à la variété de Java, qui est, comme nous le savons tous, au sommet de Coldfusion. Java nous propose java.util.regex.Pattern .
Alors voici ce que nous faisons réellement:
- Invoquez la méthode
Compilepartir de l'objet Classes dePatternet transmettez-lui le modèle de regex (qui dépose probablement le modèle regex pour une utilisation ultérieure). - Appelez la méthode
Matchersur ce que la méthodeCompilerenvoyé et passez la chaîne où le modèle doit être exécuté. - Testez si la correspondance a été réussie en appelant la méthode
findsur la méthode de retour de la méthodeMatcher.
Si matcher.find() retourne true , on pourrait dire "Ca y est", mais il y a une petite chose à considérer: l'objet Pattern de Java stocke les groupes et nous donne accès via une autre fonction, ce qui n'est pas toujours le meilleur pour traitement ultérieur et pas si cohérent en ce qui concerne la façon dont les autres langages de programmation traitent ce cas. Par conséquent, nous effectuons une boucle sur matcher.group() afin de pouvoir passer un tableau contenant les groupes capturés à la fonction de rappel. Et maintenant nous pouvons dire: "Ça y est!"
Fonction REReplaceCallback définie par l'utilisateur
function REReplaceCallback(re,str,callback) {
/*
Thanks to Ben Nadel
"Learning ColdFusion 8: REMatch() For Regular Expression Matching"
from 2007-06-13
https://www.bennadel.com/blog/769-learning-coldfusion-8-rematch-for-regular-expression-matching.htm
*/
pattern = CreateObject("java","java.util.regex.Pattern").Compile(Arguments.re);
matcher = pattern.Matcher(Arguments.str);
if(matcher.find()) {
groups = [];
for(var i = 1; i lte matcher.groupCount(); i++) {
ArrayAppend(groups,matcher.group(Val(i)));
}
return Arguments.callback(groups);
}
else {
return Arguments.callback(false);
}
}
Utilisation de la fonction REReplaceCallback
REReplaceCallback('YOUR REGEX GOES HERE','AND YOUR STRING HERE',function(groups) {
//now you can access the 'groups' array containing all the captured groups
return result; //return whatever you've processed inside
});