coldfusion
Trabajar con RegExp Reemplazar devoluciones de llamada
Buscar..
Introducción
Si desea algo más que un simple reemplazo de cadena con expresiones regulares comunes, ciertamente se encontrará con problemas y llegará a la pared cuando descubra los límites de las funciones de expresión regular que tiene Coldfusion. No hay una función incorporada como la preg_replace_callback de php.
Parámetros
| Parámetro | Detalles |
|---|---|
re | La expresion regular |
str | La cadena a la que debe aplicarse la expresión regular. |
callback | La función donde se agrupó el grupo capturado se pasará si se encuentra una coincidencia. Allí se pueden procesar los partidos. |
Observaciones
Debido a que Coldfusion en sí no ofrece lo que queremos, recurrimos a la variedad de Java, que es, como todos sabemos, por encima de Coldfusion. Java nos ofrece java.util.regex.Pattern .
Así que aquí está lo que realmente hacemos:
- Invoque el método de
Compiledesde el objeto de Clase dePatterny pasándole el patrón de expresiones regulares (que probablemente deposite el patrón de expresiones regulares para su uso posterior). - Invoque el método
Matchersobre lo que devolvió el métodoCompiley pasando la cadena donde se debe ejecutar el patrón. - Compruebe si la coincidencia fue exitosa invocando el método de
findsobre lo que devolvió el método deMatcher.
Si matcher.find() devuelve true , podríamos decir "Eso es todo", pero hay una pequeña cosa que debemos tener en cuenta: el objeto Patrón de Java almacena los grupos y nos da acceso a través de otra función, que no siempre es la mejor manera de Procesamiento adicional y no tan consistente con respecto a cómo otros lenguajes de programación manejan este caso. Por lo tanto, hacemos un bucle sobre matcher.group() para que podamos pasar una matriz que contiene los grupos capturados a la función de devolución de llamada. Y ahora podemos decir: "¡Eso es!"
Función de REReplaceCallback definida por el usuario
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);
}
}
Usando la función 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
});