Czy ktoś zna bardzo szybki sposób na zastąpienie ostatniego wystąpienia łańcucha innym ciągiem?
Czy ktoś zna bardzo szybki sposób na zastąpienie ostatniego wystąpienia łańcucha innym ciągiem?
Odpowiedzi:
Możesz użyć tej funkcji:
function str_lreplace($search, $replace, $subject)
{
$pos = strrpos($subject, $search);
if($pos !== false)
{
$subject = substr_replace($subject, $replace, $pos, strlen($search));
}
return $subject;
}
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 jak substr_replace
i str_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 nazwie strpos
i strrpos
? Dzięki ...
Kolejny 1-liniowy, ale bez preg:
$subject = 'bourbon, scotch, beer';
$search = ',';
$replace = ', and';
echo strrev(implode(strrev($replace), explode(strrev($search), strrev($subject), 2))); //output: bourbon, scotch, and beer
$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
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!!!
$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!'; echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
Możesz to zrobić:
$str = 'Hello world';
$str = rtrim($str, 'world') . 'John';
Wynik to „Hello John”;
pozdrowienia
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:
function str_lreplace($search, $replace, $subject)
{
return preg_replace('~(.*)' . preg_quote($search, '~') . '(.*?)~', '$1' . $replace . '$2', $subject, 1);
}
AKTUALIZACJA Nieco bardziej zwięzła wersja ( http://ideone.com/B8i4o ):
function str_lreplace($search, $replace, $subject)
{
return preg_replace('~(.*)' . preg_quote($search, '~') . '~', '$1' . $replace, $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.
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
if($findChar !== FALSE) {
$string[$findChar]=".";
}
echo $string;
Oprócz błędów w kodzie, Faruk Unal ma najlepszą odpowiedź. Jedna funkcja załatwia sprawę.
Możesz użyć strrpos (), aby znaleźć ostatnie dopasowanie.
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
$string[$findChar]=".";
echo $string;
Wyjście: picture_0007.value
Krótka wersja:
$NewString = substr_replace($String,$Replacement,strrpos($String,$Replace),strlen($Replace));
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'
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.
function preg_rreplace($search, $replace, $subject) {
preg_match_all($search, $subject, $matches, PREG_SET_ORDER);
$lastMatch = end($matches);
if ($lastMatch && false !== $pos = strrpos($subject, $lastMatchedStr = $lastMatch[0])) {
$subject = substr_replace($subject, $replace, $pos, strlen($lastMatchedStr));
}
return $subject;
}
Lub jako skrótowe połączenie / implementacja obu opcji:
function str_rreplace($search, $replace, $subject) {
return (false !== $pos = strrpos($subject, $search)) ?
substr_replace($subject, $replace, $pos, strlen($search)) : $subject;
}
function preg_rreplace($search, $replace, $subject) {
preg_match_all($search, $subject, $matches, PREG_SET_ORDER);
return ($lastMatch = end($matches)) ? str_rreplace($lastMatch[0], $replace, $subject) : $subject;
}
na podstawie https://stackoverflow.com/a/3835653/3017716 i https://stackoverflow.com/a/23343396/3017716
s($str)->replaceLast($search, $replace)
pomocny, co znajdziesz w tej samodzielnej bibliotece .