Я хочу создать функцию PHP, которая заменит некоторые слова из текста внутренними ссылками. Это работает до сих пор, но если у меня есть два совпадения, я получаю недопустимый код HTML.
Пример:
Welpen / hunde Chihuahua Welpen / hunde, чихуахуа
function seo_internal_links($str, $links, $limit) { foreach($links AS $link){ $pattern[$k] = "~\b($link[phrase])\b~i"; $replace[$k] = '<a href="'.$link[link].'">\\1</a>'; $k++; } return preg_replace($pattern,$replace,$str, $limit); } seo_internal_links($ad[text], $seo_internal_links, $limit = 1);
Это приведет к:
<a href="//hunde,chihuahua">Chihuahua <a href="/hunde">Welpen</a></a>
Кто-нибудь знает, как этого избежать? Я также хотел бы ограничить количество обращений, но предел в preg_replace учитывает только уникальные слова, а не весь массив.
Некоторые аддитивные объяснения.
Я забираю слова для замены и их соответствующие ответы из таблицы. Их сотни.
$stmt =" SELECT * FROM $T73 ORDER BY prio desc "; $result = execute_stmt($stmt, $link); while ($row = mysql_fetch_object($result)){ $seo_internal_links[$row->ID]['phrase'] = $row->phrase; $seo_internal_links[$row->ID]['link'] = $row->link; } $my[text] = seo_internal_links($my[text], $seo_internal_links, $limit = 1);
Проблема возникает, потому что функция замены снова начнет в начале текста для поиска следующего слова. Вместо этого он должен просто продолжаться внутри текста.
Моя цель – вставить внутренние ссылки на текст моего веб-сайта всякий раз, когда соответствующее слово находится внутри таблицы, полной ключевых слов. Например, замените «beagle welpen» на « beagle welpen» . Если слово «welpen» также находится внутри таблицы, оно сломает html-код и снова добавит href-тег.
Вместо использования цикла создайте одно регулярное выражение и измените весь документ за один проход. То есть вместо этих регулярных выражений:
~\b(foo)\b~i ~\b(bar)\b~i ~\b(baz)\b~i
Используйте только этот:
~\b(foo|bar|baz)\b~i
Возможно, вам захочется взглянуть на использование implode
для управления регулярным выражением.
Вы также должны быть осторожны с символами, которые имеют особое значение внутри регулярного выражения. Вы можете найти preg_quote
полезным для этого.