;=============================================================================== ; Function Name...: _String_Balanced ; Description.....: Ermittelt einen ausbalancierten String innerhalb folgender ; ................: Begrenzer: "()", "{}", "[]", "" ; ................: Tags bei spitzen Klammern sind optional, ; ................: müssen aber für öffnend und schließend identisch sein. ; Parameter(s)....: $_sStr String mit begrenztem Substring ; ................: $_sOpen Das öffnende Zeichen des Begrenzerpaares und optional der Tag '' ; .....optional...: $_iOccurence 0 (Standard) Rückgabe aller Funde als Array mit Zähler an [0]. ; ................: n Beginnt am n-ten Vorkommen von $_sOpen im String. ; ................: Negative Werte zählen Vorkommen von rechts. ; ................: Occurence greift nur, wenn $_iOffset < 1. ; .....optional...: $_iOffset Position im String zum Start der Selektion. ; ................: 0 (Standard) Occurence wird verwendet. ; Return Value(s).: Erfolg: Der ermittelte String inkl. der Begrenzer. ; ................: Fehler: Leerstring @error = 1 $_sOpen beginnt nicht mit '(', '{', '[' oder '<' ; ................: @error = 2 $_sOpen nicht in $_sStr enthalten ; ................: @error = 3 $_iOccurence größer als Anzahl Begrenzer ; Author(s).......: BugFix ( bugfix@autoit.de ) ;=============================================================================== Func _String_Balanced($_sStr, $_sOpen, $_iOccurence=0, $_iOffset=0) If Not StringInStr($_sStr, $_sOpen) Then Return SetError(2, 0, '') Local $sTag = '' If StringLeft($_sOpen, 1) = '<' Then $sTag = StringTrimLeft($_sOpen, 1) $_sOpen = '<' EndIf If Not StringInStr('({[<', $_sOpen) Then Return SetError(1, 0, '') StringReplace($_sStr, $_sOpen & $sTag, $_sOpen & $sTag) Local $iMax = @extended If Abs($_iOccurence) > $iMax Then Return SetError(3, 0, '') If $_iOffset < 1 Or $_iOffset = '' Then $_iOffset = 0 Local $sClose, $sPattern, $fFirst = False, $iLast, $vOut = '' Local $countOpen = 0 If $_iOffset = 0 And $_iOccurence <> 0 Then $_iOffset = StringInStr($_sStr, $_sOpen & $sTag, 1, $_iOccurence) EndIf If $_sOpen = '(' Then $sClose = ')' Else $sClose = Chr(Asc($_sOpen) +2) EndIf Local $sEscape = '' If StringInStr('({[', $_sOpen) Or $sClose = ')' Then $sEscape = '\' $sPattern = $sEscape & $_sOpen & $sTag & '|' & $sTag & $sEscape & $sClose While 1 $aMatch = StringRegExp($_sStr, $sPattern, 1, $_iOffset) If Not @error Then $_iOffset = @extended If StringInStr('({[', $aMatch[0]) Or _ StringInStr('<' & $sTag, $aMatch[0]) Then $countOpen += 1 Else $countOpen -= 1 EndIf If Not $fFirst Then $iLast = $_iOffset $fFirst = True ContinueLoop EndIf $vOut &= StringMid($_sStr, $iLast, $_iOffset-$iLast-1) If $countOpen = 0 Then ExitLoop $iLast = $_iOffset -1 Else ExitLoop EndIf Wend If $_iOccurence = 0 Then Local $n = 2, $match = $vOut, $aOut[2] = [1, $_sOpen & $sTag & $vOut & $sClose] While True $match = _String_Balanced($_sStr, $_sOpen & $sTag, $n, 0) If Not @error Then $aOut[0] += 1 ReDim $aOut[$aOut[0] +1] $aOut[$aOut[0]] = $match $n += 1 Else Return $aOut EndIf WEnd Else Return $_sOpen & $sTag & $vOut & $sClose EndIf EndFunc ;==>_String_Balanced