我正在解析字符串,需要将多个关键字替换为其他资源的锚标签。
我已经尝试替换锚标记中未包含的代码。
$link = '<a href="{$href}" title="{$title}">{$phrase}</a>';
$text = preg_replace('/(?!\<a.*)'.$phrase.'(?!\<\/a\>)/', $link, $text);
Input: foo bar is a good name
1. replace bar with -> <a href="/test" title="foo">bar</a>
2. replace foo with -> <a href="/test2" title="bar">foo</a>
Desired output: <a href="/test2" title="bar">foo</a> <a href="/test" title="foo">bar</a> is a good name
但是我当前的正则表达式将title="foo"
替换为其中的锚点。
答案 0 :(得分:0)
我以某种方式设法获得了预期的结果。如果有人偶然发现了这个问题,这就是我实现的代码。
$text = 'INPUT STRING WHERE TO <strong>FIND</strong> MATCHES';
$phrases = ['STRING','FIND'];
foreach ($phrases as $phrase) {
$splitByTags = preg_split('/(<.*?>)/', $text, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
$pureText = array_filter($splitByTags, function($item, $key) use ($splitByTags){
return (
stripos($item, '<') === false &&
(isset($splitByTags[$key - 1]) && stripos($splitByTags[$key - 1], '<a') === false)//need to filter out strings who have preceding anchor tag
);
}, ARRAY_FILTER_USE_BOTH);
$tagElements = array_diff_key($splitByTags, $pureText);
foreach($pureText as &$element) {
$link = '<a href="{$href}" title="{$title}" target="{$target}">{$phrase}</a>';
$element = str_replace($phrase, $link, $element);
}
$aText = $pureText + $tagElements;
ksort($aText);
$text = implode('', $aText);
}