Creat0R
Цитата:
если вызывается подфункция которая возвращает значения в исходную функцию, то это как бы своего рода Callback »
|
"своего рода" может быть, AFAIK изначально CallBack был задуман для управления поведением бинарного кода, который неизменяем (так как уже скомпилирован) через использование указателей. Чем-то похоже на клиент-серверную технологию, только "серверу" передаются на обработку не данные, а код. Фишка еще в том, что «сервер» может выполняться с другими правами в системе. Но даже если понимать CallBack как вызов пользовательской UDF из сервисной, то в твоем случае CallBack-функцией будет как раз _UpperMatches(), а не *RegExpReplace*
Цитата:
Valik мне там ответил в тикете, он утверждает что эта затея средствами UDF не реализуема »
|
гм… интересно, про PHP не знал… по сути, я уже озвучил точку зрения Valik'а в своем постскриптуме про StringReplace, хотя его пример уже совсем про другое – про особенность работы StringRegExp… что касаемо принципиальной невозможности реализации… имхо можно поизголяться

...вот пример с двумя реализациями UDF: первый показывает ошибку при использовании StringReplace, во втором я попытался ее обойти.
Код:

$sString = "c:\DIR1\DIR1\file1.txt" &@CRLF
$sString &= "c:\DIR1\DIRA\file2.doc" &@CRLF
$sString &= "c:\DIR1\file1.txt" &@CRLF
$sRetVar1 = _StringRegExpReplaceEx1($sString, "(?i)(c:\\DIR1)([^\r\n]+)", "_ChPathExt")
$sRetVar2 = _StringRegExpReplaceEx2($sString, "(?i)(c:\\DIR1)([^\r\n]+)", "_ChPathExt")
MsgBox(64, "Results", StringFormat("Было:\n%s\nСтало_1:\n%s\n\nСтало_2:\n%s\n\n" & _
"Для всех файлов в исходном пути убирается корневая папка.", $sString, $sRetVar1, $sRetVar2))
Func _StringRegExpReplaceEx1($sString, $sPattern, $sFunction)
Local $aM1 = StringRegExp($sString, $sPattern, 4)
Local $sReplace, $aM2
If IsArray($aM1) Then
For $i=0 To UBound($aM1)-1
Local $as[10]=['','','','','','','','','','']
$aM2=$aM1[$i]
For $j=0 To UBound($aM2)-1
$as[$j]=$aM2[$j]
Next
$sReplace = Call($sFunction, $as)
$sString = StringReplace($sString, $aM2[0], $sReplace, 1, 1)
Next
EndIf
Return $sString
EndFunc
Func _StringRegExpReplaceEx2($sString, $sPattern, $sFunction)
Local $sSqueeze = StringRegExpReplace($sString, $sPattern, Chr(0))
Local $aSqueeze = StringSplit($sSqueeze, Chr(0))
Local $sResult = ""
Local $aM1 = StringRegExp($sString, $sPattern, 4), $aM2
If IsArray($aM1) Then
For $i=0 To UBound($aM1)-1
Local $as[10]=['','','','','','','','','','']
$aM2=$aM1[$i]
For $j=0 To UBound($aM2)-1
$as[$j]=$aM2[$j]
Next
$sResult &= $aSqueeze[$i+1] & Call($sFunction, $as)
Next
EndIf
Return $sResult & $aSqueeze[$aSqueeze[0]]
EndFunc
Func _ChPathExt($aGroups)
Local Const $sNewRoot = "c:"
Return $sNewRoot & $aGroups[2]
EndFunc