2014-01-20 54 views
1

需要幫助的新手!用數組值替換字符串中的文本

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

我想用它自己的超鏈接版本替換$ some_text中$ extracted_array的每個值。

所以「這個紅包......」成爲

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

在PHP 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

這是一個很好的方法來做到這一點。它回答我的問題,但是當我插入實際的超鏈接時會出現一些小問題。 「這個紅色......」實際上應該變成:「This red ...」 – Bosmaen

+0

'$ match [0]'是$ extracted_array'中項目的匹配項,回調的返回值是該模式將被替換的內容用。我相信你會進一步操縱返回值。我只是一個'sprintf'怪胎,你可以使用'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