Замена нескольких фраз в строке - PullRequest
0 голосов
/ 10 июня 2019

Я анализирую строку и мне нужно заменить несколько ключевых слов тегами привязки на другие ресурсы.

Я уже пытался заменить код, который не заключен в теги привязки.

$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 голосов
/ 10 июня 2019

Мне как-то удалось получить желаемый результат.Если кто-то наткнется на этот вопрос, это код, который я реализовал.

$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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...