Мне нужно иметь функцию, которая преобразует определенные слова в текст в ссылки, поэтому я использую 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
Используйте обратные ссылки, чтобы убедиться, что вы не замените что-то, что уже находится в теге, например
/(?!<a href=\"#\".*)\b(".preg_quote($value).")\b(?!.*<\/a>)/i
(?!<a href=\"#\".*)
просто проверяет, что не может быть открывающий тег перед вашим поисковым словом
(?!.*<\/a>)
гарантирует, что после вашего поискового запроса не будет закрывающего тега
preg_replace()
сделает это за вас, поэтому он начинается с самого длинного поиска. Просто сделайте это за один раз, и вы готовы к работе.
$arr = array("php", "sql", "and sql");
?