Итак, я понимаю, что у вас есть список слов, которые должны быть связаны в теле HTML. str_replace () обрабатывает это, но не для ссылок уже внутри якорей?
Вы хотите игнорировать совпадающие слова, если они находятся внутри тегов привязки?
PHP не поддерживает отрицательный внешний вид переменной ширины, поэтому невозможно сказать, что не совпадает, где есть тег привязки, идущий от совпадающего слова, так как тег привязки заголовка имеет переменную длину.
Способ решения этой проблемы - заменить все из них, а затем отменить изменения, которые не должны были быть сделаны.
<?php
// Setup data
$words = array('lorem' => 'www.google.com',
'ipsum' => 'www.bbc.co.uk',
'test' => 'www.amazon.co.uk');
$textBody = '<p>This is a short test of <a href="www.slashdot.org">lorem ipsum</a> automatic anchoring. Let us see if it works, any incidences of lorem or ipsum, should be caught.</p>';
// Make basic replacements, but use a different tag than anchor
// so it can be detected separately from previously existing anchors
// I am using the <argh> tag
$wordExpressions = array();
$wordReplacements = array();
foreach ($words as $cWord => $cLink) {
$wordExpressions[] = '#' . preg_quote($cWord) . '#';
$wordReplacements[] = '<argh href="' . $cLink . '">' . $cWord . '</argh>';
}
$replacedText = preg_replace($wordExpressions, $wordReplacements, $textBody);
// At the moment, there are nested anchors
echo $replacedText;
// Use a fairly horrific recursive anchor tag callback replacement to delete any
// <argh> tags inside <a> tags
$replacedText =
preg_replace_callback("#(<a [^>]*>)((?:[^<]|<(?!/?a>)|(?R))+)(</a>)#",
create_function('$a', 'return $a[1] . preg_replace("#<argh[^>]*>(.*?)</argh>#", "$1", $a[2]) . $a[3];'),
$replacedText);
// No nested anchors now
echo $replacedText;
// Finally replace the <argh> tags with straight <a>s
$replacedText = preg_replace(array('#<argh #', '#</argh>#'), array('<a ', '</a>'), $replacedText);
// The output should now be correct
echo $replacedText;
?>
Это выглядит немного хуже, чем это, особенно рекурсивный обратный вызов регулярного выражения. Все, что нужно, - это сопоставить парные теги привязки и передать совпадение функции, которая просто возвращает пропатченную пару и удаляет новые теги из внутреннего содержимого. Джеффри Фридл .
рассказывает об использовании рекурсивных замен в "1010 *" освоении регулярных выражений ".
Тэг может быть любым, я использовал это слово, поскольку вряд ли оно существует в HTML и кажется подходящим для рассматриваемой проблемы. : -)
У вас что-то подобное работает?