2015-03-09 4 views
0

Я пытаюсь заменить несколько возможных строк только одним в PHP. Кроме того, строки должны соответствовать только полное слово:Заменить несколько строк одной строкой

<? 

$rawstring = "Hello NONE. Your N/A is a pleasure to have! Your friend Johanna is also here."; 

//strings for substitution 
$placeholders = array('N/A', 'NA', 'NONE'); 

//replace with blank spaces. 
$substitution = array(''); 

$greeting = str_ireplace($placeholders, $substitution, $rawstring); 

echo $greeting . "<br />"; 
?> 

Это результирующая строка:

Hello . Your is a pleasure to have! Your friend Johan is also here. 

Это почти на выходе я ищу. Я бы хотел, чтобы подстановка затрагивала только отдельные слова. В этом случае он заменяет «na» в «Johanna», в результате чего «Johan». Он должен все же распечатать «Йоханну».

Возможно ли это?

EDIT: Я не могу управлять $ rawstring. Это просто пример.

+0

Создание замены быть строка ('$ подмена = ''; ') будет делать замену для вас. Более сложная часть заменяет только «целые слова». Для этого используется общий подход [регулярное выражение] (http://regular-expressions.info) и [границы слов] (http://www.regular-expressions.info/wordboundaries.html), например '$ result = preg_replace ('/ \ bSQUIRREL \ b/i', 'kitty', 'Oh look, squirrel!'); ' – salathe

ответ

2

Чтобы не соответствовать частям слова, вам необходимо использовать preg_replace().

попробовать что-то вроде этого:

$rawstring = "Hello NONE. Your N/A is a pleasure to have! Your friend Johanna is also here."; 
$placeholders = array('N/A', 'NA', 'NONE'); 

//Turn $placeholders into an array of regular expressions 
// `#` delimits the regular expression. Make sure this doesn't appear in $placeholders. 
// `(.+)` matches and captures any string of characters 
// `\b` matches word boundaries 
// `${1}` reinserts the captured pattern. 
// `i` at the end makes this case insensitive. 
$re = preg_replace('#(.+)#', '#\b${1}\b#i', $placeholders); 

//Make the same substitution for all matches. 
$substitution = ''; 

$greeting = preg_replace($re, $substitution, $rawstring); 
echo $greeting; 
+0

Мне нравится то, что вы там сделали. Очень сжатый механизм замены, а также оцените комментарии, объясняющие переменную $ re. –

0

Я создал ассоциативный массив, чтобы настроить вары для замены. - редактировать, пришлось слеш в N/A

$val_to_swap_in = ''; 
$replacers = array(
    '/NONE/' => $val_to_swap_in, 
    '/N\/A/' => $val_to_swap_in, 
    '/NA/' => $val_to_swap_in, 
); 
$greeting = preg_replace(array_keys($replacers), array_values($replacers), $rawstring); 

Привели это в PHP CLI оболочки:

Hello . Your is a pleasure to have! Your friend Johanna is also here. 
+0

К сожалению, у меня нет никакого контроля над входящей строкой. Я не могу заменить токены. – RafaelM

0

Я смотрю на http://php.net/sprintf, если вы уже знаете строку и просто глядя на суб в определенных местах. Извините за ответ. Мне еще не хватает репутации, чтобы комментировать.

Смежные вопросы