替换字符串中的多个短语

时间:2019-06-10 08:54:17

标签: php regex

我正在解析字符串,需要将多个关键字替换为其他资源的锚标签。

我已经尝试替换锚标记中未包含的代码。

$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"替换为其中的锚点。

1 个答案:

答案 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);
}