StringReplace problem

  • Hallo
    ich habe ein Problem it StringReplace.
    Beispiel:

    [autoit]

    $text = "test..................test"
    $instr = StringInStr ($text,"test",2,2)
    $mid = StringMid ($text,$instr,5)
    MsgBox (0,"",$mid)
    $text = StringReplace ($text,$mid,"lol")
    MsgBox (0,"",$text)

    [/autoit]

    Ich will mit StringReplace nur das ändern was $mid gefunden hat nichts anderes.
    Wie krige ich das hin?

  • Hi,

    Dein Beispiel macht genau das, was Du beschreibst. Ersetze alles was mit $mid gefunden wird: In Deinem Fall test am Anfang und am Ende, da $mid = test.

    Wenn Du willst, dass nur das erste test ersetzt wird, hätte ein Blick in die Hilfe genügt:

    $text = StringReplace ($text,$mid,"lol", 1)

    ;-))
    Stefan

  • Soll das dann so "lol..................test" aussehen?

    Edit: Das von ojo hätte ich dann auch vorgeschlagen.

  • Als kleine Erweiterung:
    Wäre der String "test...........test...........test...........test...........test" und du möchtest zb nur das 2te und das 3te "test" ersetzen, dann kann ich dir _StringReplaceEx() empfehlen

    Spoiler anzeigen
    [autoit]

    $text = "test...........test...........test...........test...........test"
    $instr = StringInStr ($text,"test",2,2)
    $mid = StringMid ($text,$instr,4)
    ;~ MsgBox (0,"",$mid)
    $text = _StringReplaceEx($text,$mid,"lol",2,2)
    MsgBox (0,"",$text)

    [/autoit] [autoit][/autoit] [autoit]

    ;=================================================================================================
    ; Function: _StringReplaceEx($sString,$sSearchString,$sReplaceString[,$iOccurence[,$iHowOften[,$iCaseSense]]])
    ; Description: Extends StringReplace(). Giving you the ability to choose the first occurence to start with,
    ; and how many times the Searchstring should be replaced.
    ;
    ; Parameter(s): $sString - The string to evaluate.
    ; $sSearchString - The substring to search.
    ; $sReplaceString - The replacement string.
    ; $iOccurence - (optional) The substrings occurence to start with. (1) by default.
    ; $iHowOften - (optional) The number of times to replace the searchstring.
    ; (1) by default. Set this parameter to (0) if you want the
    ; function to replace all occurences of the Searchstring, starting with the one
    ; in $iOccurence. Use a negative value, to search from the right to left.
    ; $iCaseSense - (optional) Flag to indicate if the operations should be case sensitive.
    ; 0 = not case sensitive, using the user's locale (default)
    ; 1 = case sensitive
    ; 2 = not case sensitive, using a basic/faster comparison
    ;
    ; Requirement(s): Valid parameters :P
    ;
    ; Return Value(s): On Success - Returns the new string
    ; On Failure - Returns 0
    ; @Error - 0 = No error.
    ; 1 = Function called with invalid parameters
    ; 2 = Searchstring was not found at the given occurence
    ;
    ; Author(s): SEuBo (http://www.autoit.de)
    ; Note(s):
    ;=================================================================================================
    Func _StringReplaceEx($sString,$sSearchString,$sReplaceString,$iOccurence=1,$iHowOften=1,$iCaseSense=0)
    If $sSearchString = "" Or $sString = "" Or $iOccurence < 1 OR $iCaseSense < 0 Or $iCaseSense > 2 Then Return SetError(1,0,0)
    If $iHowOften = 0 Then $i = -1
    If $iHowOften >= 0 Then
    Local $i = 1
    If Not StringInStr($sString,$sSearchString,$iCaseSense,$iOccurence) Then Return SetError(2,0,0)
    Do
    $sString = StringLeft($sString,StringInStr($sString,$sSearchString,$iCaseSense,$iOccurence)-1)&StringReplace(StringTrimLeft(StringTrimRight($sString,StringLen($sString)-StringInStr($sString,$sSearchString,$iCaseSense,$iOccurence)-StringLen($sSearchString)),StringInStr($sString,$sSearchString,$iCaseSense,$iOccurence)-1),$sSearchString,$sReplaceString)&StringRight($sString,StringLen($sString)-StringInStr($sString,$sSearchString,$iCaseSense,$iOccurence)-StringLen($sSearchString))
    If $iHowOften <> 0 Then $i += 1
    Until $i > $iHowOften OR Not StringInStr($sString,$sSearchString,$iCaseSense,$iOccurence)
    Else
    Local $i = -1
    $sString = _StringReplaceEx_Reverse($sString)
    $sSearchString = _StringReplaceEx_Reverse($sSearchString)
    $sReplaceString = _StringReplaceEx_Reverse($sReplaceString)
    If Not StringInStr($sString,$sSearchString,$iCaseSense,$iOccurence) Then Return SetError(2,0,0)
    Do
    $sString = StringLeft($sString,StringInStr($sString,$sSearchString,$iCaseSense,$iOccurence)-1)&StringReplace(StringTrimLeft(StringTrimRight($sString,StringLen($sString)-StringInStr($sString,$sSearchString,$iCaseSense,$iOccurence)-StringLen($sSearchString)),StringInStr($sString,$sSearchString,$iCaseSense,$iOccurence)-1),$sSearchString,$sReplaceString)&StringRight($sString,StringLen($sString)-StringInStr($sString,$sSearchString,$iCaseSense,$iOccurence)-StringLen($sSearchString))
    $i -= 1
    Until $i < $iHowOften OR Not StringInStr($sString,$sSearchString,$iCaseSense,$iOccurence)
    $sString = _StringReplaceEx_Reverse($sString)
    EndIf
    Return $sString
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;=================================================================================================
    ;#####INTERNAL USE#####
    ;_StringReplaceEx_Reverse : Reverses the contents of the specified string. (without a dll-call)
    ;SEuBo (http://www.autoit.de)
    ;=================================================================================================
    Func _StringReplaceEx_Reverse($sString)
    Local $sReverse = ""
    For $x = 1 to StringLen($sString)
    $sReverse &= StringRight($sString,1)
    $sString = StringTrimRight($sString,1)
    Next
    Return $sReverse
    EndFunc
    ;=================================================================================================

    [/autoit]
  • Ehm wie kann ich das machen das es genau das nimmt welches mit $mid gefunden wurde obwohl ich ich nicht weiß welches test es ist?


  • Nein, die hab ich gestern durch die Anregung in Freakys anderem Thread geschrieben :D

    Meinst du das hier?

    [autoit]

    Func _StringReplace($sString,$sSubString,$sReplaceString,$iOccurence=1,$iCaseSense=0)
    ;SEuBo
    Return StringLeft($sString,StringInStr($sString,$sSubString,$iCaseSense,$iOccurence)-1) & _
    StringReplace(StringTrimLeft(StringTrimRight($sString,StringLen($sString)-StringInStr($sString,$sSubString,$iCaseSense,$iOccurence)-StringLen($sSubString)),StringInStr($sString,$sSubString,$iCaseSense,$iOccurence)-1),$sSubString,$sReplaceString) & _
    StringRight($sString,StringLen($sString)-StringInStr($sString,$sSubString,$iCaseSense,$iOccurence)-StringLen($sSubString))
    EndFunc

    [/autoit]

    Aber die ist doch anders.

  • Aber die ist doch anders.

    Ja, ich habe das ganze eben noch Erweitert. Es ist mit der "neuen" Version möglich, rückwärts zu suchen, und die Möglichkeit, die Anzahl der "Ersetzungen" zu bestimmen ist auch da. Außerdem hab ich ein bisschen mehr Error Handling eingebaut. Das ganze kann man auch samt GUI Beispiel im Skripte-Unterforum finden.