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:

  1. Anropa metoden Compile från Pattern Class-objektet och skickar regex-mönstret till det (vilket antagligen sätter regex-mönstret för senare användning).
  2. Anropa Matcher metoden för vad Compile metoden returnerade och passerade strängen där mönstret ska köras.
  3. Testa om matchningen var framgångsrik genom att anropa find metoden på vad Matcher metoden 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
});


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow