Это все еще возвращалось правда, несмотря ни на что. Попробуйте изменить его следующим образом: if ($ pos) {$ subject = substr_replace ($ subject, $ replace, $ pos, strlen ($ search)); вернуть $ субъект; } else {return false; }
Джаззи
4
@ Джейсон Это не вернется TRUEни на что. Он возвращает строку, несмотря ни на что. Если замена не может быть произведена, она возвращает оригинал $subject, как substr_replace и str_replaceделает.
Миша
@ Миша Разве это не то же самое в этом случае? Я пытался сделать что-то вроде! Str_lreplace, но если он не возвращает false, это считается верным, верно? В любом случае, это помогло мне, и я ценю это. Спасибо.
Джаззи
1
Как это может работать? strpos — Find the position of the first occurrence of a substring in a string- редактировать: вау. Php гении действительно сделали функцию под названием strposи strrpos? Спасибо ....
BarryBones41
1
@Barry это один случай , когда PHP не заслуживает вину :-) Имена узорной на многие десятилетия strstr, strrstrиз стандартной библиотеки C, которые одни и те же функции. (Но они должны были изменить имя?)
FWIW, принятое решение примерно на 35% быстрее, чем это решение.
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
Самое крутое решение на мой взгляд и до сих пор легко понять.
Blackbam
Почему это работает со всеми перевернутыми строками? Есть ли какой-то (я полагаю) определенный прирост производительности при использовании регулярных выражений?
Kamafeather
Нет, это на самом деле снижает производительность, но это потому, что вы хотите только последнее вхождение, поэтому вы ограничиваете поиск до одного и полностью изменяете все, если вы хотите первое, вам не нужно ничего
менять
15
Следующее довольно компактное решение использует положительное предварительное утверждение 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);
Ремер
Действительно, код, который я разместил, изменяет все экземпляры «fox», кроме последнего, на «dog», но мы хотим с точностью до наоборот. Спасибо, что указали на замену? = На?! устраняет проблему
Это работает до тех пор, пока нет повторяющихся символов. В моей ситуации я убираю номер страницы с даты архива, поэтому у меня "2015-12 / 2", и все / и все 2 с конца становятся "2015-1".
Майк
Это будет работать только в том случае, если последнее найденное вхождение является последним словом и не имеет дополнительных символов после него.
AwesomeGuy
Это не работает, потому rtrimчто не ведет себя так, как вы думаете. Он удалит с конца любые символы, которые существуют в строке поиска в любом порядке (и всегда добавляют замену), например, «Hello word» -> «Hello John», «Hello lord» -> «Hello John», «Hello мотор "->" Привет, motJohn "," Привет, мир "->" Привет, мирyJohn ".
Джейк
5
Это также будет работать:
function str_lreplace($search, $replace, $subject){return preg_replace('~(.*)'. preg_quote($search,'~').'(.*?)~','$1'. $replace .'$2', $subject,1);}
Я делаю это неправильно? Если так, просто игнорируй меня :) ||| echo str_lreplace ("x", "y", "this x или that x"); => Вывод: "y" См .: ideone.com/UXuTo
edorian
@edorian: Ой! Извините, я спешил опубликовать, правильная версия здесь: ideone.com/vR073 .
Аликс Аксель
5
Всего одна строка кода (поздний ответ, но его стоит добавить):
$string ='The quick brown fox jumps over the lazy dog';
$find_me ='dog';
preg_replace('/'. $find_me .'$/','', $string);
Это древний вопрос, но почему все упускают простейшее решение на основе регулярных выражений? Нормальные кванторы регулярных выражений жадные люди! Если вы хотите найти последний экземпляр шаблона, просто вставьте .*перед ним. Вот как:
$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.
Спасибо! Идеальная функция, чтобы обернуть мое выражение лица, чтобы выполнить это. В моем случае я заменяю последнюю запятую на "и". Рад, что прокрутил немного в этом списке ответов.
Вам необходимо проверить, не является ли $ findChar ложным (так же, как в принятом ответе). Если строка не содержит искомой строки, вы получите уведомление, и первый символ будет заменен.
мохнатый
Это замечательно, но в его нынешнем виде он может заменить только 1 символ на 1 символ.
Пит
3
Вы можете использовать strrpos (), чтобы найти последнее совпадение.
Используйте «$» в выражении 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'
s($str)->replaceLast($search, $replace)
полезным, как найти в этой автономной библиотеке .Ответы:
Вы можете использовать эту функцию:
источник
TRUE
ни на что. Он возвращает строку, несмотря ни на что. Если замена не может быть произведена, она возвращает оригинал$subject
, какsubstr_replace
иstr_replace
делает.strpos — Find the position of the first occurrence of a substring in a string
- редактировать: вау. Php гении действительно сделали функцию под названиемstrpos
иstrrpos
? Спасибо ....strstr
,strrstr
из стандартной библиотеки C, которые одни и те же функции. (Но они должны были изменить имя?)Еще 1 вкладыш, но без прега:
источник
источник
Следующее довольно компактное решение использует положительное предварительное утверждение PCRE для соответствия последнему вхождению интересующей подстроки, то есть вхождению подстроки, за которым не следуют другие вхождения той же подстроки. Таким образом, пример заменяет
last 'fox'
с'dog'
.ВЫВОД:
источник
$string = 'The quick brown fox, fox, fox jumps over the lazy fox!!!'; echo preg_replace('/(fox(?!.*fox))/', 'dog', $string);
Вы могли бы сделать это:
Результат «Привет Джон»;
С уважением
источник
rtrim
что не ведет себя так, как вы думаете. Он удалит с конца любые символы, которые существуют в строке поиска в любом порядке (и всегда добавляют замену), например, «Hello word» -> «Hello John», «Hello lord» -> «Hello John», «Hello мотор "->" Привет, motJohn "," Привет, мир "->" Привет, мирyJohn ".Это также будет работать:
ОБНОВЛЕНИЕ Чуть более краткая версия ( http://ideone.com/B8i4o ):
источник
Всего одна строка кода (поздний ответ, но его стоит добавить):
окончание $ указывает на конец строки.
источник
Это древний вопрос, но почему все упускают простейшее решение на основе регулярных выражений? Нормальные кванторы регулярных выражений жадные люди! Если вы хотите найти последний экземпляр шаблона, просто вставьте
.*
перед ним. Вот как:Это заменит последний экземпляр «fox» на «DUCK», как это должно быть, и напечатает:
источник
Помимо ошибок в коде, у Фарука Унала есть лучший ответ. Одна функция делает свое дело.
источник
Вы можете использовать strrpos (), чтобы найти последнее совпадение.
Вывод: picture_0007.value
источник
Сокращение для принятого ответа
источник
Короткая версия:
источник
Используйте «$» в выражении reg, чтобы соответствовать концу строки
источник
Для интересующихся: я написал функцию, которая использует preg_match, чтобы вы могли заменить с правой стороны с помощью регулярных выражений.
Или как сокращенная комбинация / реализация обоих вариантов:
на основе https://stackoverflow.com/a/3835653/3017716 и https://stackoverflow.com/a/23343396/3017716
источник