Хтось знає про дуже швидкий спосіб замінити останнє виникнення рядка іншим рядком у рядку?
Хтось знає про дуже швидкий спосіб замінити останнє виникнення рядка іншим рядком у рядку?
Відповіді:
Ви можете використовувати цю функцію:
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
не веде себе так, як ти думаєш. З кінця буде викреслено будь-які символи, які існують у рядку пошуку в будь-якому порядку (і завжди додавати заміну), наприклад "Привіт слово" -> "Привіт Джон", "Привіт лорд" -> "Привіт Джон", "Привіт мотор "->" Привіт motJohn "," Привіт, світлий "->" Привіт worldyJohn ".
Це також буде працювати:
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;
Вихід: малюнок_0007.значення
Коротка версія:
$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, щоб ви могли замінити з правого боку за допомогою regex.
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)
корисні, як це знайдено в цій самостійній бібліотеці .