Кто-нибудь знает очень быстрый способ заменить последнее вхождение строки другой строкой в строке?
Кто-нибудь знает очень быстрый способ заменить последнее вхождение строки другой строкой в строке?
Ответы:
Вы можете использовать эту функцию:
function str_lreplace($search, $replace, $subject)
{
$pos = strrpos($subject, $search);
if($pos !== false)
{
$subject = substr_replace($subject, $replace, $pos, strlen($search));
}
return $subject;
}
TRUE
ни на что. Он возвращает строку, несмотря ни на что. Если замена не может быть произведена, она возвращает оригинал $subject
, как substr_replace
и str_replace
делает.
strpos — Find the position of the first occurrence of a substring in a string
- редактировать: вау. Php гении действительно сделали функцию под названием strpos
и strrpos
? Спасибо ....
Еще 1 вкладыш, но без прега:
$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
Следующее довольно компактное решение использует положительное предварительное утверждение PCRE для соответствия последнему вхождению интересующей подстроки, то есть вхождению подстроки, за которым не следуют другие вхождения той же подстроки. Таким образом, пример заменяет last 'fox'
с 'dog'
.
$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!';
echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
ВЫВОД:
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);
Вы могли бы сделать это:
$str = 'Hello world';
$str = rtrim($str, 'world') . 'John';
Результат «Привет Джон»;
С уважением
rtrim
что не ведет себя так, как вы думаете. Он удалит с конца любые символы, которые существуют в строке поиска в любом порядке (и всегда добавляют замену), например, «Hello word» -> «Hello John», «Hello lord» -> «Hello John», «Hello мотор "->" Привет, motJohn "," Привет, мир "->" Привет, мирyJohn ".
Это также будет работать:
function str_lreplace($search, $replace, $subject)
{
return preg_replace('~(.*)' . preg_quote($search, '~') . '(.*?)~', '$1' . $replace . '$2', $subject, 1);
}
ОБНОВЛЕНИЕ Чуть более краткая версия ( http://ideone.com/B8i4o ):
function str_lreplace($search, $replace, $subject)
{
return preg_replace('~(.*)' . preg_quote($search, '~') . '~', '$1' . $replace, $subject, 1);
}
Это древний вопрос, но почему все упускают простейшее решение на основе регулярных выражений? Нормальные кванторы регулярных выражений жадные люди! Если вы хотите найти последний экземпляр шаблона, просто вставьте .*
перед ним. Вот как:
$text = "The quick brown fox, fox, fox, fox, jumps over etc.";
$fixed = preg_replace("((.*)fox)", "$1DUCK", $text);
print($fixed);
Это заменит последний экземпляр «fox» на «DUCK», как это должно быть, и напечатает:
The quick brown fox, fox, fox, DUCK, jumps over etc.
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
if($findChar !== FALSE) {
$string[$findChar]=".";
}
echo $string;
Помимо ошибок в коде, у Фарука Унала есть лучший ответ. Одна функция делает свое дело.
Вы можете использовать strrpos (), чтобы найти последнее совпадение.
$string = "picture_0007_value";
$findChar =strrpos($string,"_");
$string[$findChar]=".";
echo $string;
Вывод: picture_0007.value
Короткая версия:
$NewString = substr_replace($String,$Replacement,strrpos($String,$Replace),strlen($Replace));
Используйте «$» в выражении reg, чтобы соответствовать концу строки
$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'
Для интересующихся: я написал функцию, которая использует preg_match, чтобы вы могли заменить с правой стороны с помощью регулярных выражений.
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;
}
Или как сокращенная комбинация / реализация обоих вариантов:
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;
}
на основе https://stackoverflow.com/a/3835653/3017716 и https://stackoverflow.com/a/23343396/3017716
s($str)->replaceLast($search, $replace)
полезным, как найти в этой автономной библиотеке .