coldfusion
Lavorare con RegExp Sostituire i callback
Ricerca…
introduzione
Se vuoi qualcosa di più di una semplice sostituzione di una stringa con espressioni regolari comuni, ti imbatti nei guai e colpisci il muro quando scopri i limiti delle funzioni regex di Coldfusion. Non esiste una funzione preg_replace_callback -in come preg_replace_callback di php.
Parametri
| Parametro | Dettagli |
|---|---|
re | L'espressione regolare |
str | La stringa che dovrebbe essere applicata alla regex |
callback | La funzione in cui verranno trasferiti i gruppi catturati se è stata trovata una corrispondenza. Lì le partite possono essere processate |
Osservazioni
Poiché la stessa Coldfusion non offre ciò che vogliamo, facciamo ricorso alla varietà di Java, che è - come tutti sappiamo - in cima a Coldfusion. Java ci offre java.util.regex.Pattern .
Quindi ecco cosa facciamo effettivamente:
- Richiama il metodo
Compiledall'oggettoPatternClass e passa ad esso il pattern regex (che probabilmente deposita il pattern regex per un uso futuro). - Richiama il metodo
Matchersu quale sia il metodo diCompilerestituito e passa la stringa in cui deve essere eseguito il pattern. - Verifica se la corrispondenza ha avuto successo invocando il metodo
findsu quale sia il metodoMatcherrestituito.
Se matcher.find() restituisce true , potremmo dire "That's it", ma c'è una piccola cosa da considerare: l'oggetto Pattern di Java memorizza i gruppi e ci dà accesso tramite un'altra funzione, che non è sempre il modo migliore per ulteriore elaborazione e non coerente quanto a come altri linguaggi di programmazione gestiscono questo caso. Quindi eseguiamo il loop su matcher.group() modo che possiamo passare una matrice contenente i gruppi catturati alla funzione di callback. E ora possiamo dire: "Ecco fatto!"
Funzione REReplaceCallback definita dall'utente
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);
}
}
Utilizzando la funzione 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
});