Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось amel27, 07-10-2008 в 06:36.

Это сообщение посчитали полезным следующие участники:

Отправлено: 05:43, 07-10-2008 | #966