2014-01-20 2 views
1

Новичок нуждается в помощи!Заменить текст внутри строки значениями массива

$some_text = "This red bag will contain green apples."; 
    $extracted_array = array("red","bag","green","apples","what","why"); //obtained from database 

Я хотел бы заменить каждое вхождение значений extracted_array $ в $ some_text с гиперссылкой версией самого себя.

Так «Этот красный мешок ...» становится

This <a href="#">red</a> bag... 

Это то, что я писал:

foreach($extracted_array AS $value) { 
    $new_value = '<a href="#">'.$value.'</a>'; 
    $new_text = str_ireplace($value, $new_value, $some_text); 
      } 
    print_r($linked_content); 

Но это просто заменяет каждое вхождение с последним значением петли $ extracted_array (т. е. «почему»)

Пожалуйста, покажите мне, как я могу сделать это правильно.

+0

В РНР 5.3.0, @Flosculus ответ является правильным выбором! –

ответ

1
$some_text = "This red bag will contain green apples."; 
$extracted_array = array("red","bag","green","apples","what","why"); 

$expr = sprintf('/%s/i', implode('|', $extracted_array)); 

echo preg_replace_callback($expr, function($match){ 
    return sprintf('<a href="#">%s</a>', $match[0]); 
}, $some_text); 

Выход:

This <a href="#">red</a> <a href="#">bag</a> will contain <a href="#">green</a> <a href="#">apples</a>. 
+0

Это, безусловно, лучший и правильный способ сделать это! –

+0

Это очень хороший способ сделать это. Он отвечает на мой вопрос, но возникает небольшая проблема, когда я вставляю фактические гиперссылки. «Этот красный ...» на самом деле должен стать: «Это red ...» – Bosmaen

+0

'$ match [0]' - это совпадение элемента в '$ extract_array', возвращаемое значение обратного вызова - это то, что этот шаблон будет заменен с. Im 'уверен, что вы еще больше манипулируете возвращаемым значением. Я просто «sprintf» freak, вы можете использовать 'return ''.$match[0].''' – Flosculus

0

Я думаю, что есть лучшие функции в PHP, но я покажу вам, как сделать это с кодом:

$some_text = "This red bag will contain green apples."; 
$extracted_array = array("red","bag","green","apples","what","why"); //obtained from database 

foreach($extracted_array AS $value) { 
    $new_value = '<a href="#">'.$value.'</a>'; 
    $some_text = str_ireplace($value, $new_value, $some_text); 
} 

print_r($some_text); 

Ваш код принимает каждый $some_text и сохраняет его в $new_text, но никогда не изменяет $some_text для этого $new_text является оригинал $some_text с измененным последним элементом массива.

0

Вы можете сделать два массива и отправить их на str_ireplace. Однако это может стать громоздким, если общее количество замен, которое вы делаете, довольно велико. Функция заменит строку из $ aFind элементом (с тем же индексом) из $ aReplace.

$aFind = array("red", "green"); 
$aReplace = array("<a href='/red.php'>red</a>", "<a href='/green.php'>green</a>"); 
$newString = str_ireplace($aFind, $aReplace, $some_text); 
print($newString); 
+0

Спасибо, эта идея сработала для меня, но я все еще использовал str_replace. Я напишу свой ответ выше. – Bosmaen

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