使用数组替换文本
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.
我想象 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);
伙计们, 我想替换文本,在特定单词上添加特定链接。 所以,我创建了一个这样的动态数组:
$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.
我想象 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);