# Letztes Vorkommen ersetzen ?



## Hatachy (15. Mai 2004)

Hi

stehe wohl gerade auf dem Schlacuh, finde auch nirgends was.
Wie kann man denn das letzte Vorkommen ersetzen. preg_replace(... mit limit=-1) hilft ja leider nicht. Minus kennt er ja nicht (außer -1, und das bedeuted ja leider = 0)

Mir fiele als Lösung nur das Umdrehen des Strings und das Umdrehen des Suchstrings ein. Würde wohl gehen, aber gibts da sonst noch ne Möglichkeit bzw. Funktion, die ich übersehen habe ?


----------



## meilon (15. Mai 2004)

Sorry, aber ich habe nicht ganze Verstanden was du willst? Willst du den letzten Buchstaben eines Strings erstzen? das würde mit 
	
	
	



```
$ausgabeneu = substr($ausgabe , 0 ,-1);
$endausgabe= $ausgabeneu.$ansatz;
```


----------



## Hatachy (15. Mai 2004)

ne das letzte Vorkommen eines stringes in einem String

(mod. PHP-Handbuch Beispiel)


```
<?php
$string = "April 15, 2003, Januar 16, 2004";
$pattern = "/(\w+) (\d+), (\d+)/i";
$replacement = "\${1}1,\$3";
$limit = 1;
preg_replace($pattern, $replacement, $string, $limit);
?>
```

Nun kommt raus:
April1,2003, Januar 16, 2004

Soll aber rauskommen:

April 15,2003, Januar1, 2004

bräuchte garkein preg_replace
str_replace wäre passender. brauch das ganze aber halt für:
=> 1x ersetzen von hinten

// Edit:
da du gerade mit Positionen anfängst, stimmt eigentlich
statt einfach ersetzen, dann  Posi bestimmen und ersetzen, posi bestimmen und ersetzen, usw.

danke, werds mal probieren. wundert mich trotzdem irgendwie dass keine funktion das kann, aber wofür kann man ja welche selberschreiben 

// Edit2:
Hmm, war wohl nix, kann wohl kaum von PHP5 ausgehen, somit gibts keine Funktion nach dem letzten vorkommen eines Stringes zu suchen. also entweder steh ich total aufm Schlauch oder es gibt keine Möglichkeit außer umdrehen aller Sachen.


----------



## Hatachy (15. Mai 2004)

Hier mein schneller Versuch mit umdrehen. Bin jedoch auch weiter für Vorschläge offen 


```
<?php
    function str_replace_last($search, $replace, $str) {

        $str_rev     = strrev($str);
        $search_rev  = strrev($search);
        $replace_rev = strrev($replace);
        
        $pos = strpos($str_rev, $search_rev);
        
        if($pos !== FALSE) {
            
            return strrev(substr_replace($str_rev, $replace_rev, $pos, strlen($search)));
            
        } else {
            
            return $str;
            
        }

    }
?>
```

// EDIT

nochmal etwas überarbeitet (für den Fall, dass noch jemand sone Funktion braucht). Unterstützt jetzt wie str_replace auch arrays. allerdings verhält sie sich nicht identisch, wenn eine variable und ein array angegeben werden:


```
echo str_replace("test", array("test", "test2"), "test test2 test3 test4");
```
 => Array Array2 Array3 Array4


```
echo str_replace_last("test", array("test", "test2"), "test test2 test3 test4");
```
 => test test2 test3 test24


```
<?php
    function str_replace_last($search, $replace, $str) {

        $str_rev     = strrev($str);

        if(!is_array($search) AND !is_array($replace)) {

            $search_rev  = strrev($search);
            $replace_rev = strrev($replace);

            if($pos !== FALSE) {
                
                $pos = strpos($str_rev, $search_rev);
                
            }

            $str_rev = substr_replace($str_rev, $replace_rev, $pos, strlen($search_rev));

        } else {

            if(!is_array($replace)) {

                $replace = array_fill(0, count($search), $replace);

            } else {

                $search  = array_fill(0, count($replace), $search);

            }

            for($i=0; $i<count($search); $i++) {

                $search_rev  = strrev($search[$i]);
                $replace_rev = strrev($replace[$i]);

                $pos = strpos($str_rev, $search_rev);

                if($pos !== FALSE) {

                    $str_rev = substr_replace($str_rev, $replace_rev, $pos, strlen($search_rev));

                }

            }

        }

        return strrev($str_rev);

    }
?>
```

// EDIT:
habe bei dem STring-Fall (also nicht array) das if($pos !== FALSE) hinzugefügt, da es zu Fehlern kam


----------



## split (16. Mai 2004)

Mein Lösungsvorschlag (str_replace einmal von hinten):
	
	
	



```
function replaceLastMatch($search, $replace, $text)
{
    $arr = explode($search, $text);
    if(count($arr) > 1) {
        $return = $arr[0];
        for($i=1; $i<=count($arr)-2; $i++) {
            $return .= $search.$arr[$i];
        }
        $return .= $replace.$arr[count($arr)-1];
        return $return;
    }
    else {
        return $text;
    }
}
```
Anwendungsbeispiel:
	
	
	



```
echo replaceLastMatch('foo', 'bar', 'asdf foo ba drfoo foob lol foo asdd');

//Ausgabe würde lauten:
//asdf foo ba drfoo foob lol bar asdd
```
//EDIT:
Es ist bei meiner Methode allerdings nicht möglich, Arrays als Parameter zu übergeben!


----------



## Hatachy (16. Mai 2004)

danke 
auch schön, verhällt sich wieder ganz anders. nciht so wie meine und nciht so wie die "normale". 

// Edit

doch es ist möglich, macht nur nicht was sie soll. aber immerhin keine fehler


----------



## split (16. Mai 2004)

Unter der "normalen" verstehst du das normale str_replace() oder?

Aber genau so wolltest du es doch, dass nur der letzte Treffer ersetzt wird...

Also bei

"foo", "bar", "foo foo2"

eben

"foo bar2"

Hab ich dich falsch verstanden?


----------



## Hatachy (16. Mai 2004)

schon editiert 
war leichter Stuss ... lies doch nciht immer so schnell. lass mir doch ein paar minuten zum editieren


----------

