Replace с условием (модуль перелинковки)

TF-Studio
На сайте с 17.08.2010
Offline
334
623

Пытаюсь придумать решение задачи:

Некий модуль перелинковки.

есть массив для замены

(допустим спорт)

'Евгений Малкин' => '{some_url}'

'НХЛ лига' => '{some_url}'

и так далее, большой словарь.

Есть текст новости/статьи, где надо все вхождения заменить, но может быть так, что $key уже находится в ссылке <a href="">хоккеист Евгений Малкин ***</a>

и соответственно если просто менять - то будет косяк.

<a href="">хоккеист <a href="">Евгений Малкин</a> ***</a>

Что-то адекватное и изящное решение не находится.

Пока придумал только убрать все ссылки, пройтись заменой, потом вернуть их обратно.

но такой подход чреват нагрузкой (все динамично должно быть) при большом словаре и при множественном проходе, ибо есть 2 ступени перелинковки.

1 - большие фразы

2 - просто слова ( 'НХЛ' => '{some_url}' )

Кто-нибудь решал подобную задачу или натолкнёт в каком направлении думать?

Всё ещё лучший способ заработка для белых сайтов: GoGetLinks (https://www.gogetlinks.net/?inv=fahbn8).
дани мапов
На сайте с 06.09.2012
Offline
204
#1

Можно только доработать этот метод, не вырезать ссылки, а например перевернуть анкоры задом-наперед во всех ссылках, тогда совпадений не будет. После замены, заново пройтись и снова перевернуть анкоры, теперь уже будет как надо.



function utf8_strrev($str){
preg_match_all('/./us', $str, $ar);
return join('',array_reverse($ar[0]));
}


$line = 'В последнем матче <a href="http://google.com">хоккеист Евгений Малкин забил шайбу</a> в ворота противника.';
$line = preg_replace_callback(
'#(<a[^<>]+?>)(.*?)(<\/a>)#',
create_function(
'$matches',
'return $matches[1].utf8_strrev($matches[2]).$matches[3];'
),
$line
);
echo $line;
Написание и доработка скриптов (PHP, MySQL, JavaScript, jQuery) (/ru/forum/811046)
siv1987
На сайте с 02.04.2009
Offline
427
#2

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

дани мапов
На сайте с 06.09.2012
Offline
204
#3
siv1987:
Те же яйца. Кроме того, после замены их надо перевернуть обратно, так чтобы новые не задеть.

Какие новые? Анкоры в ссылках вообще не надо менять с помощью массива замен, насколько я понял.

TF-Studio
На сайте с 17.08.2010
Offline
334
#4

был просто текст "малкин" - мы его меняем на <a href="/malkin">малкин</a>

siv1987
На сайте с 02.04.2009
Offline
427
#5
дани мапов:
Какие новые?

Новые замены.

TF-Studio:
был просто текст "малкин" - мы его меняем на <a href="/malkin">малкин</a>

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий