coldfusion
Praca z RegExp Zamień wywołania zwrotne
Szukaj…
Wprowadzenie
Jeśli chcesz czegoś więcej niż prostego zastąpienia łańcucha zwykłymi wyrażeniami regularnymi, na pewno napotkasz problemy i uderzysz w ścianę, odkrywając granice funkcji wyrażenia regularnego, jakie ma Coldfusion. Nie ma wbudowanej funkcji takiej jak phg's preg_replace_callback .
Parametry
| Parametr | Detale |
|---|---|
re | Wyrażenie regularne |
str | Ciąg, który powinien być zastosowany w wyrażeniu regularnym |
callback | Funkcja, w której przechwycone zgrupowane zostaną przekazane, jeśli znaleziono dopasowanie. Tam dopasowania mogą być przetwarzane |
Uwagi
Ponieważ sama Coldfusion nie oferuje tego, czego chcemy, uciekamy się do różnorodności Java, która - jak wszyscy wiemy - jest na szczycie Coldfusion. Java oferuje nam java.util.regex.Pattern .
Oto, co faktycznie robimy:
- Wywołaj metodę
Compilez obiektu klasyPatterni przekazując mu wzorzec wyrażenia regularnego (który prawdopodobnie umieszcza wzorzec wyrażenia regularnego do późniejszego użycia). - Wywołaj metodę
Matcherna podstawie tego, co zwróciła metodaCompile, i przekazując ciąg, w którym należy wykonać wzorzec. - Sprawdź, czy dopasowanie zakończyło się powodzeniem, wywołując metodę
findna podstawie tego, co zwróciła metodaMatcher.
Jeśli matcher.find() zwróci wartość true , moglibyśmy powiedzieć „To jest to”, ale jest jedna drobna rzecz, którą musimy wziąć pod uwagę: Obiekt Pattern języka Java przechowuje grupy i daje nam dostęp za pośrednictwem innej funkcji, co nie zawsze jest najlepszym sposobem na dalsze przetwarzanie i niespójne pod względem sposobu obsługi tego przypadku przez inne języki programowania. Dlatego zapętlamy matcher.group() , abyśmy mogli przekazać tablicę zawierającą przechwycone grupy do funkcji wywołania zwrotnego. A teraz możemy powiedzieć: „To jest to!”
Zdefiniowana przez użytkownika funkcja 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);
}
}
Korzystanie z funkcji 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
});