使用数组替换文本

Text replace using array

伙计们, 我想替换文本,在特定单词上添加特定链接。 所以,我创建了一个这样的动态数组:

$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 中有字符串 "ferrari 2" 它将被替换为 [法拉利] 而不是 [法拉利 2].

如何进行精确匹配?

非常感谢!

将顺序更改为:

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

通常在替换时,只需将顺序更改为最小键最后出现的位置即可解决很多问题。

您可以使用以下解决方案:

$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

我想象 var $subject 是这样的:

$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);