2010-09-13 5 views
6
$variable = 'put returns between paragraphs'; 

Значение этой переменной каждый раз изменяется.Заменить последнее слово в строке

Как добавить текст перед последним словом?


Мол, если мы хотим, чтобы добавить 'and', результат должен быть (в данном примере):

$variable = 'put returns between and paragraphs'; 

ответ

2

Вы можете использовать preg_replace():

$add = 'and'; 
$variable = 'put returns between paragraphs';  
echo preg_replace("~\W\w+\s*$~", ' ' . $add . '\\0', $variable); 

Отпечатки:

put returns between and paragraphs 

Это будет игнорировать конечные пробелы, что-то, что решение jensgram не имеет. (Например: он сломается, если ваша строка $variable = 'put returns between paragraphs ' Конечно, вы можете использовать trim(), но зачем тратить больше памяти и вызвать другую функцию, когда вы можете сделать это с регулярным выражением :-)

+2

Я не могу приписать источник, но однажды услышал эту замечательную цитату «У меня была проблема и я решил использовать регулярные выражения. Теперь у меня есть две проблемы» – Zak

+0

как добавить какой-нибудь html вместо «и» в ваше решение? – James

+0

@ Zak Это не проблема, если вы понимаете регулярное выражение и знаете, что он может и чего не может сделать. – NullUserException

1
1) reverse your string 
2) find the first whitespace in the string. 
3) chop off the remainder of the string. 
4) reverse that, append your text 
5) reverse and add back on the first portion of the string from step 3, including extra whitespace as needed. 
+0

реверсивного что много раз полностью unnessecary – GSto

+1

, конечно, это но это просто, и этот простой вопрос, очевидно, требует простого, понятного ответа на простом английском языке (а не в коде), чтобы пройти логический процесс решения проблемы. – Zak

+0

Если у вас не было 'strrpos', этот алгоритм кажется вполне разумным. – erisco

1
$addition = 'and'; 
$variable = 'put returns between paragraphs'; 
$new_variable = preg_replace('/ ([^ ]+)$/', ' ' . $addition . ' $1', $variable); 
+0

Рассмотрите возможность замены '*' на '+' в шаблоне. – jensgram

+0

@jensgram Спасибо, что поймали это. –

10

Вы можете найти .? последний пробельные используя strrpos() функцию:

$variable = 'put returns between paragraphs'; 
$lastSpace = strrpos($variable, ' '); // 19 

Затем возьмите два substrings (до и после последнего пробела) и обернуть вокруг «и»:

$before = substr(0, $lastSpace); // 'put returns between' 
$after = substr($lastSpace); // ' paragraphs' (note the leading whitespace) 
$result = $before . ' and' . $after; 

EDIT
Хотя никто не хочет связываться с индексами подстроки это очень основная задача, для которой PHP поставляется с полезными функциями (strrpos() и специфически substr()). Следовательно, нет необходимости жонглировать массивы, обратной строки или регулярные выражения - но вы может, конечно :)

+0

отличный ответ jensgram. – Zak

+1

@NullUserException Вы правы в отношении возможного конечного пробела ('trim()' может быть решением).С точки зрения решения «чище» это очень субъективно. Вышесказанное легко комментировать (и, следовательно, легко понять), в то время как я сам нахожу решения регулярных выражений аккуратными. – jensgram

+1

Я нахожу, что мой реджикс-раствор чище, чем это. Кроме того, вы можете настроить его для использования разных разделителей или игнорировать конечные пробелы (например, мои). Это сломается, если ваша строка '' put возвращает между абзацами '' (с завершающим пробелом) – NullUserException

1

другого варианта

<?php 
    $v = 'put returns between paragraphs'; 
    $a = explode(" ", $v); 
    $item = "and"; 
    array_splice($a, -1, 0, $item); 
    echo implode(" ",$a); 
    ?> 
Смежные вопросы