coldfusion
Arbeta med RegExp Ersätt återuppringningar
Sök…
Introduktion
Om du vill ha mer än en enkel strängbyte med vanliga reguljära uttryck stöter du säkert på problem och träffar väggen när du upptäcker gränserna för regexfunktioner som Coldfusion har. Det finns ingen preg_replace_callback funktion som phps preg_replace_callback .
parametrar
| Parameter | detaljer |
|---|---|
re | Det vanliga uttrycket |
str | Strängen som ska tillämpas regexen |
callback | Funktionen där den fångade grupperade passeras om en matchning hittades. Där kan matchningarna behandlas |
Anmärkningar
Eftersom Coldfusion i sig inte erbjuder det vi vill, använder vi oss av variationen i Java, som - som vi alla vet - ovanpå Coldfusion. Java erbjuder oss java.util.regex.Pattern .
Så här är vad vi faktiskt gör:
- Anropa metoden
CompilefrånPatternClass-objektet och skickar regex-mönstret till det (vilket antagligen sätter regex-mönstret för senare användning). - Anropa
Matchermetoden för vadCompilemetoden returnerade och passerade strängen där mönstret ska köras. - Testa om matchningen var framgångsrik genom att anropa
findmetoden på vadMatchermetoden tillbaka.
Om matcher.find() återgår true , kan vi säga "Det är det", men det är en liten sak vi måste tänka på: Java's Pattern-objekt lagrar grupperna och ger oss åtkomst via en annan funktion, vilket inte alltid är det bästa sättet för vidare bearbetning och inte så konsekvent när det gäller hur andra programmeringsspråk hanterar detta fall. Därför slingrar vi över matcher.group() så att vi kan överföra en matris som innehåller de fångade grupperna till återuppringningsfunktionen. Och nu kan vi säga: "Det är det!"
Användardefinierad REReplaceCallback-funktion
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);
}
}
Använda REReplaceCallback-funktionen
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
});