To wciąż powracało prawdą bez względu na wszystko. Rozważ zmodyfikowanie go na: if ($ pos) {$ subject = substr_replace ($ subject, $ replace, $ pos, strlen ($ search)); return $ subject; } else {return false; }
Jazzy,
4
@Jason Nie wraca TRUEbez względu na wszystko. Zwraca ciąg bez względu na wszystko. Jeśli nie można dokonać wymiany, zwraca oryginał $subject, tak jak substr_replace i str_replacezrób.
Mischa,
@Mischa Czy to nie to samo w tym przypadku? Próbowałem zrobić coś takiego jak! Str_lreplace, ale jeśli nie zwraca fałszu, jest uważane za prawdziwe, prawda? Tak czy inaczej, pomogło mi to i doceniam to. Dzięki.
Jazzy
1
Jak to działa? strpos — Find the position of the first occurrence of a substring in a string- edycja: wow. Geniusze PHP naprawdę stworzyli funkcję o nazwie strposi strrpos? Dzięki ...
BarryBones41
1
@Barry to jest jeden przypadek, w którym PHP nie zasługują winę :-) Nazwy są wzorowane na dziesiątków lat strstr, strrstrstandardowej biblioteki C, które są takie same funkcje. (Ale czy musieli zmienić nazwę?)
FWIW, przyjęte rozwiązanie jest około 35% szybsze niż to rozwiązanie.
JustCarty
27
$string ='this is my world, not my world';
$find ='world';
$replace ='farm';
$result = preg_replace(strrev("/$find/"),strrev($replace),strrev($string),1);
echo strrev($result);//output: this is my world, not my farm
Moim zdaniem najfajniejsze rozwiązanie, a jednocześnie łatwe do zrozumienia.
Blackbam
Dlaczego to działa z odwróconymi wszystkimi ciągami? Czy jest jakiś (zakładam) określony wzrost wydajności podczas używania wyrażeń regularnych?
Kamafeather
Nie, to faktycznie zmniejsza wydajność, ale to dlatego, że chcesz tylko ostatniego wystąpienia, więc ograniczasz wyszukiwanie do jednego i
odwracasz
15
Poniższe, raczej zwarte rozwiązanie, używa pozytywnego asercji wyprzedzającej PCRE, aby dopasować ostatnie wystąpienie podciągu będącego przedmiotem zainteresowania, to znaczy wystąpienie podciągu, po którym nie następuje żadne inne wystąpienie tego samego podciągu. W ten sposób przykład zastępuje last 'fox'z 'dog'.
$string ='The quick brown fox, fox, fox jumps over the lazy fox!!!';
echo preg_replace('/(fox(?!.*fox))/','dog', $string);
WYNIK:
The quick brown fox, fox, fox jumps over the lazy dog!!!
Pomysł jest dobry, ale kod nie. To musi być:$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!'; echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
Roemer
Rzeczywiście, kod, który opublikowałem, zmienia wszystkie wystąpienia „fox” z wyjątkiem ostatniego na „pies”, ale to, czego chcemy, jest dokładnie odwrotne. Dziękuję za wskazanie, że zastąpienie? = Z?! rozwiązuje problem.
Działa to, o ile nie ma żadnych powtarzających się znaków. W mojej sytuacji usuwam numer strony z daty archiwizacji, więc mam „2015-12 / 2” i wszystkie / i wszystkie 2 z końca stają się „2015-1”.
Mike
Działa to tylko wtedy, gdy ostatnie wyszukiwane wystąpienie jest ostatnim słowem i nie ma po nim żadnych dodatkowych znaków.
AwesomeGuy,
To nie działa, ponieważ rtrimnie zachowuje się tak, jak myślisz. Usuwa z końca wszystkie znaki, które istnieją w ciągu wyszukiwania w dowolnej kolejności (i zawsze dołącza zastąpienie), np. „Witaj słowo” -> „Witaj John”, „Witaj panie” -> „Witaj John”, „Witaj motor "->" Hello motJohn "," Hello worldy "->" Hello worldyJohn ".
Jake,
5
To również zadziała:
function str_lreplace($search, $replace, $subject){return preg_replace('~(.*)'. preg_quote($search,'~').'(.*?)~','$1'. $replace .'$2', $subject,1);}
To odwieczne pytanie, ale dlaczego wszyscy pomijają najprostsze rozwiązanie oparte na wyrażeniach regularnych? Zwykłe kwantyfikatory regexp są chciwe, ludzie! Jeśli chcesz znaleźć ostatnią instancję wzoru, po prostu trzymaj się .*przed nim. Oto jak:
$text ="The quick brown fox, fox, fox, fox, jumps over etc.";
$fixed = preg_replace("((.*)fox)","$1DUCK", $text);print($fixed);
Spowoduje to zamianę ostatniego wystąpienia „fox” na „DUCK”, tak jak powinno, i wypisze:
The quick brown fox, fox, fox, DUCK, jumps over etc.
Dzięki! Idealna funkcja do owinięcia mojej ekspresji, aby to osiągnąć. W moim przypadku ostatni przecinek zastępuję znakami „i”. Cieszę się, że przewinąłem trochę tę listę odpowiedzi.
Musisz sprawdzić, czy $ findChar nie jest fałszywe (tak samo jak w akceptowanej odpowiedzi). Jeśli ciąg nie zawiera szukanego ciągu, otrzymasz powiadomienie i pierwszy znak zostanie zastąpiony.
kudłaty
To świetnie, ale w obecnej formie może zastąpić tylko 1 znak 1 znakiem.
Pete,
3
Możesz użyć strrpos (), aby znaleźć ostatnie dopasowanie.
Użyj „$” w wyrażeniu reg, aby dopasować koniec ciągu
$string ='The quick brown fox jumps over the lazy fox';
echo preg_replace('/fox$/','dog', $string);//output'The quick brown fox jumps over the lazy dog'
s($str)->replaceLast($search, $replace)
pomocny, co znajdziesz w tej samodzielnej bibliotece .Odpowiedzi:
Możesz użyć tej funkcji:
źródło
TRUE
bez względu na wszystko. Zwraca ciąg bez względu na wszystko. Jeśli nie można dokonać wymiany, zwraca oryginał$subject
, tak jaksubstr_replace
istr_replace
zrób.strpos — Find the position of the first occurrence of a substring in a string
- edycja: wow. Geniusze PHP naprawdę stworzyli funkcję o nazwiestrpos
istrrpos
? Dzięki ...strstr
,strrstr
standardowej biblioteki C, które są takie same funkcje. (Ale czy musieli zmienić nazwę?)Kolejny 1-liniowy, ale bez preg:
źródło
źródło
Poniższe, raczej zwarte rozwiązanie, używa pozytywnego asercji wyprzedzającej PCRE, aby dopasować ostatnie wystąpienie podciągu będącego przedmiotem zainteresowania, to znaczy wystąpienie podciągu, po którym nie następuje żadne inne wystąpienie tego samego podciągu. W ten sposób przykład zastępuje
last 'fox'
z'dog'
.WYNIK:
źródło
$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!'; echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
Możesz to zrobić:
Wynik to „Hello John”;
pozdrowienia
źródło
rtrim
nie zachowuje się tak, jak myślisz. Usuwa z końca wszystkie znaki, które istnieją w ciągu wyszukiwania w dowolnej kolejności (i zawsze dołącza zastąpienie), np. „Witaj słowo” -> „Witaj John”, „Witaj panie” -> „Witaj John”, „Witaj motor "->" Hello motJohn "," Hello worldy "->" Hello worldyJohn ".To również zadziała:
AKTUALIZACJA Nieco bardziej zwięzła wersja ( http://ideone.com/B8i4o ):
źródło
Tylko jedna linia kodu (późna odpowiedź, ale warto ją dodać):
końcówka $ wskazuje koniec łańcucha.
źródło
To odwieczne pytanie, ale dlaczego wszyscy pomijają najprostsze rozwiązanie oparte na wyrażeniach regularnych? Zwykłe kwantyfikatory regexp są chciwe, ludzie! Jeśli chcesz znaleźć ostatnią instancję wzoru, po prostu trzymaj się
.*
przed nim. Oto jak:Spowoduje to zamianę ostatniego wystąpienia „fox” na „DUCK”, tak jak powinno, i wypisze:
źródło
Oprócz błędów w kodzie, Faruk Unal ma najlepszą odpowiedź. Jedna funkcja załatwia sprawę.
źródło
Możesz użyć strrpos (), aby znaleźć ostatnie dopasowanie.
Wyjście: picture_0007.value
źródło
Skrót do zaakceptowanej odpowiedzi
źródło
Krótka wersja:
źródło
Użyj „$” w wyrażeniu reg, aby dopasować koniec ciągu
źródło
Dla zainteresowanych: napisałem funkcję, która wykorzystuje preg_match, dzięki czemu można zastępować z prawej strony za pomocą wyrażenia regularnego.
Lub jako skrótowe połączenie / implementacja obu opcji:
na podstawie https://stackoverflow.com/a/3835653/3017716 i https://stackoverflow.com/a/23343396/3017716
źródło