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:

  1. Richiama il metodo Compile dall'oggetto Pattern Class e passa ad esso il pattern regex (che probabilmente deposita il pattern regex per un uso futuro).
  2. Richiama il metodo Matcher su quale sia il metodo di Compile restituito e passa la stringa in cui deve essere eseguito il pattern.
  3. Verifica se la corrispondenza ha avuto successo invocando il metodo find su quale sia il metodo Matcher restituito.

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
});


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow