coldfusion
Werken met RegExp Callbacks vervangen
Zoeken…
Invoering
Als je meer dan een simpele stringvervanging met gewone reguliere expressies wilt, kom je zeker in de problemen en stuit je op de muur wanneer je de grenzen van de regex-functies ontdekt die Coldfusion heeft. Er is geen preg_replace_callback functie zoals preg_replace_callback van php.
parameters
| Parameter | Details |
|---|---|
re | De reguliere expressie |
str | De tekenreeks die moet worden toegepast op de regex |
callback | De functie waar de vastgelegde groep wordt doorgegeven als een wedstrijd wordt gevonden. Daar kunnen de wedstrijden worden verwerkt |
Opmerkingen
Omdat Coldfusion zelf niet biedt wat we willen, maken we gebruik van de verscheidenheid aan Java, die - zoals we allemaal weten - bovenop Coldfusion staat. Java biedt ons java.util.regex.Pattern .
Dus hier is wat we eigenlijk doen:
- Invoke het
Compilewerkwijze van dePatternklasse object en het afleggen van reguliere expressie patroon (hetgeen waarschijnlijk legt de reguliere expressie patroon voor later gebruik). - Roep de
Matchermethode aan op wat deCompilemethode heeft geretourneerd en geef de string door waar het patroon moet worden uitgevoerd. - Test of matching was succesvol met een beroep op de
findmethode van wat deMatchermethode geretourneerd.
Als matcher.find() true retourneert, zouden we kunnen zeggen "Dat is het", maar er is een klein ding dat we moeten overwegen: Java's Pattern-object slaat de groepen op en geeft ons toegang via een andere functie, wat niet altijd de beste manier is om verdere verwerking en niet zo consistent met betrekking tot hoe andere programmeertalen deze zaak behandelen. Daarom lopen we over matcher.group() zodat we een array met de vastgelegde groepen kunnen doorgeven aan de callback-functie. En nu kunnen we zeggen: "Dat is alles!"
Door de gebruiker gedefinieerde REReplaceCallback-functie
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);
}
}
De REReplaceCallback-functie gebruiken
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
});