2016-12-15 53 views
1

我們, 我想替換一個文本,添加特定單詞的特定鏈接。 所以,我創建了一個動態數組像這樣:使用數組替換文本

$replace = array (
    "ferrari" => '<a href="x">ferrari</a>', 
    "ferrari 2" => '<a href="x">ferrari 2</a>' 
    etc.  
) 

我找到了一種方法來代替文字使用:

preg_replace(array_keys($replace), array_values($replace), $subject)

,但如果在$subject有字符串「法拉利2」它將被替換爲 [法拉利]而不是[法拉利2]。

我該怎麼做一個完全匹配?

非常感謝!

+0

地方'ferra在'ferrari'之前的ri 2項目在陣列。如果您不使用正則表達式,請使用'str_replace'。 –

+1

@WiktorStribiżew這將得到一些嵌套的'a'標籤,這可能不是預期的結果:-) – jeroen

+0

你可以發佈字符串$ subject嗎? – kip

回答

0

您可以採用如下方案:

$s = "he has a ferrari and ferrari 2 and what not."; // SAMPLE STRING 
$replace = array (         // REPLACEMENTS ARRAY 
    "ferrari" => '<a href="x">ferrari</a>', 
    "ferrari 2" => '<a href="x">ferrari 2</a>' 
); 
$keys = array_map('strlen', array_keys($replace)); // SORTING BY KEY LENGTH 
array_multisort($keys, SORT_DESC, $replace);  // IN DESCENDING ORDER 

$pat = '~' . implode("|", array_keys($replace)) . '~'; // BUILDING A PATTERN 
echo $pat . "\n"; // => ~ferrari 2|ferrari~ - matches either ferrari 2 or ferrari 

$res = preg_replace_callback($pat, function($m) use ($replace) { // REPLACING... 
     return isset($replace[$m[0]]) ? $replace[$m[0]] : $m[0]; // IF THE KEY EXISTS, 
    }, $s);        // REPLACE WITH VALUE, ELSE KEEP THE MATCH 
echo $res; // => he has a <a href="x">ferrari</a> and <a href="x">ferrari 2</a> and what not. 

PHP demo

+1

謝謝!你的想法,以長期訂購是解決方案! – kurtafterjim

0

順序更改爲:

$replace = array (
    "ferrari 2" => '<a href="x">ferrari 2</a>' 
    "ferrari" => '<a href="x">ferrari</a>', 
) 

通常當你更換,只是改變了以最小的關鍵是最後解決地方很多。

+1

這將導致''... – jeroen

0

我想象了var $主題是這樣的:

$subject = 'ferrari ferrari 2'; 

試試這個:

$replace = array (
    "/ferrari(?!\s+\d+)/" => '<a href="x">ferrari</a>', 
    "/ferrari 2/" => '<a href="x">ferrari 2</a>' 
); 
echo preg_replace(array_keys($replace), array_values($replace), $subject);