Замените каждый элемент массива в строке с помощью preg_replace () только один раз, не заменяя текст, который уже был заменен

1

Мне нужно иметь функцию, которая преобразует определенные слова в текст в ссылки, поэтому я использую preg_replace(). Однако я не знаю, как пропустить слова, которые уже были преобразованы в ссылки.

Здесь код:

function highlightWords($content)
{
    $arr = array("php", "and sql", "sql");

    foreach ($arr as $key=>$value)
    {
        $content = preg_replace("/\b(".preg_quote($value).")\b/i", '<a href="#">\1</a>', $content, 1);
    }

    return $content;

}

echo highlightWords("This text will highlight PHP and SQL and sql but not PHPRO or MySQL or sqlite");

Функция должна состоять из 3 отдельных ссылок - "php", "и sql", "sql". К сожалению, результат выглядит следующим образом:

This text will highlight <a href="#">PHP</a> <a href="#">and <a href="#">SQL</a></a> and sql but not PHPRO or MySQL or sqlite

Как "рассказать" функции не обрабатывать слова, которые находятся между "а" тегами?

PS Слова в массиве ДОЛЖНЫ быть заказаны СЛУЧАЙНО, не предлагайте мне переупорядочить массив. Мне нужно изменить preg_replace

  • 0
    $arr = array("php", "sql", "and sql"); ?
  • 0
    Это не имеет ничего общего с рабочим решением. Я знаю, как переупорядочить слова в массиве, но их нужно упорядочивать случайным образом; поэтому мой вопрос был о том, как изменить функцию, а не массив
Показать ещё 2 комментария
Теги:
string
arrays
preg-replace

1 ответ

1
Лучший ответ

Используйте обратные ссылки, чтобы убедиться, что вы не замените что-то, что уже находится в теге, например

/(?!<a href=\"#\".*)\b(".preg_quote($value).")\b(?!.*<\/a>)/i
  • (?!<a href=\"#\".*) просто проверяет, что не может быть открывающий тег перед вашим поисковым словом

  • (?!.*<\/a>) гарантирует, что после вашего поискового запроса не будет закрывающего тега

  • 0
    Слова ДОЛЖНЫ быть упорядочены СЛУЧАЙНО в массиве. Ну, на самом деле, они упорядочены не совсем случайным образом, но они упорядочены по другому ключу ($ arr - это массив с множеством подмассивов на живом веб-сайте, я только упростил свой пример здесь)
  • 0
    @MindaugasLi Я забыл, вам не нужно сортировать массив, так как preg_replace() сделает это за вас, поэтому он начинается с самого длинного поиска. Просто сделайте это за один раз, и вы готовы к работе.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню