coldfusion
Работа с RegExp Заменить обратные вызовы
Поиск…
Вступление
Если вам нужна более простая замена строки с помощью обычных регулярных выражений, вы наверняка столкнетесь с проблемами и попадете в стену, когда обнаружите пределы функций регулярного выражения, которые имеет Coldfusion. Нет встроенной функции, такой как preg_replace_callback php.
параметры
| параметр | подробности |
|---|---|
re | Регулярное выражение |
str | Строка, которая должна быть применена в регулярном выражении |
callback | Функция, в которой захваченная группа будет передана, если совпадение найдено. Там матчи могут быть обработаны |
замечания
Поскольку Coldfusion сам не предлагает то, что мы хотим, мы прибегаем к многообразию Java, которое, как мы все знаем, находится поверх Coldfusion. Java предлагает нам java.util.regex.Pattern .
Итак, вот что мы на самом деле делаем:
- Вызвать метод
Compileиз объекта классаPatternи передать ему шаблон регулярного выражения (что, вероятно, откладывает шаблон регулярного выражения для последующего использования). -
MatcherметодMatcherо том, что возвращает методCompileи передавая строку, в которой должен выполняться шаблон. - Протестируйте, если совпадение прошло успешно, вызвав метод
findпоMatcherвозвращался методMatcher.
Если matcher.find() возвращает true , мы могли бы сказать «Вот оно», но есть одна маленькая вещь, которую мы должны учитывать: объект Java Java хранит группы и дает нам доступ через другую функцию, что не всегда является лучшим способом для дальнейшая обработка, а не то, что согласуется с тем, как другие языки программирования обрабатывают этот случай. Поэтому мы перебираем matcher.group() чтобы мы могли передать массив, содержащий захваченные группы, функции обратного вызова. И теперь мы можем сказать: «Вот и все!»
Определенная пользователем функция REReplaceCallback
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);
}
}
Использование функции 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
});