По договоренности
Есть текст, а также набор словосочетаний и соответствующих им url`ов. Необходимо обработать текст и проставить в нем ссылки (текст ссылок это словосочетания, а адрес это соответствующий url), в соответствии со следующими правилами:
1. Регистр букв не важен (словосочетанию "куплю мебель" соответствует "КУПЛЮ Мебель")
2. Слова могут меняться местами (словосочетанию "куплю мебель" соответствует "мебель куплю")
3. Между словами могут быть extra_words других слов (словосочетанию "куплю мебель" соответствует "куплю недорогую мебель" при extra_words>1).
4. Если left_words и/или right_words больше 0, то в анкор(текст ссылки) включается left_words слов слева от словосочетания и right_words слов справа от словосочетания.
5. В тексте выделяется не более max_links словосочетаний. Если уже выделено max_links словосочетаний, то последующие подходящие игнорируются.
6. Не выделяются словосочетания, которые находятся внутри тегов a, h1-h6, а также в параметрах самих тегов (например в alt тега img).
7. Ссылка не должна проставляться, если ее адрес совпадает с адресом текущей страницы (и не должна учитываться в max_links).
8. Ссылка не должна проставляться, если ссылка с таким адресом уже проставлена (и не должна учитываться в max_links).
9. Вышеперечисленные правила могут комбинироваться (словосочетанию "куплю мебель" соответствует "МеБель недорого КуплЮ срочно" при extra_words>1, right_words=1, left_words = 0, либо это начало предложения)
Вот заготовка, чтобы было понятнее (если считаете, что что-то из написанного в заготовке нужно написать по другому пожалуйста):
<?php
//словосочетания(анкоры), которые нужно искать и выделять ссылками (с учетом списка возможных изменений и правил)
$keywords = array(
0 => array(
'keyword' => 'продаю мебель',
'url' => '/board/sell/furniture'
),
1 => array(
'keyword' => 'продаю белорусскую мебель',
'url' => '/board/sell/furniture/belarus'
)
);
//текст, в котором нужно проставлять ссылки
$text = "Недорого продаю качественную белорусскую мебель. Обращаться в личку.";
//опции
$options = array(
"extra_words" => 2,
"left_words" => 0,
"right_words" => 0,
"max_links" => 3
);
// Выборка всех тегов <h> в массив $h_array
unset($h_array);
preg_match_all("'<h[^>]*?>.*?</h[^>]*?> 'si", $text, $h_array);
// Замена всех тегов <h> заглушкой [h_array]
$text = preg_replace("'<h[^>]*?>.*?</h[^>]*?> 'si",'[h_array]',$text);
unset($a_array);
preg_match_all("'<a[^>]*?>.*?</a>'s i", $text, $a_array);
$text = preg_replace("'<a[^>]*?>.*?</a>'si" ,'[a_array]',$text);
// Выборка всех тегов в массив $tag_array
unset($tag_array);
preg_match_all("'<[^>]*?>'si", $text, $tag_array);
// Замена всех тегов заглушкой [tag_array]
$text = preg_replace("'<[^>]*?>'si", '[tag_array]', $text);
//функция, которую требуется разработать
$text = functionOfReplacementKeywordsWithLinks($text, $keywords, $options);
// Возвращаем теги на свои места
$i = 0;
$text = preg_replace('~\[tag_array\]~e', '$tag_array[0][$i++];', $text);
// Возвращаем теги <a> на свои места
$i = 0;
$text = preg_replace('~\[a_array\]~e', '$a_array[0][$i++];', $text);
$i = 0;
$text = preg_replace('~\[h_array\]~e', '$h_array[0][$i++];', $text);
?>