Необходимо заменить слово на ссылку, естественно, если оно уже не находится внутри ссылки. С помощью утверждений (?<!) и (?!) не получается учесть ни мусор, который может быть с искомым текстом, ни атрибутов ссылки: Код (Text): (?<!\<a\>) SOME_TEXT (?!\<\/a\>) Мусор можно учесть с помощью символьного типа \W: Код (Text): (^|[\W]+)SOME_TEXT($|[\W]+) Но объединить их не получается. Исходник тестов: Код (Text): $p = 'text'; echo '<h2>Замена слова на ссылку с помощью утверждений</h2>'; $test[] = '<a> text '; $test[] = '<a> text '; $test[] = '</a> text '; $test[] = ' text <a>'; $test[] = ' text </a>'; $test[] = '<a> text </a>'; $test[] = ' text <a> text'; $test[] = '<a> text </a> text '; foreach ($test as $key => $val) { echo preg_replace('/(?<!\<a\>) ('.$p.') (?!\<\/a\>)/', '<a href="">$1</a>', $val).'<br />'."\r\n"; } unset($test); echo '<h1>Замена слова на ссылку с учетом мусора</h1>'; $test[] = 'textffdd text'; $test[] = 'text textEFff'; $test[] = '.text,'; $test[] = '<a href=""> fds text.. </a> //\text"""'; $test[] = '!text<'; $test[] = '<a href="">text</a>2""/\text'; foreach ($test as $key => $val) { echo preg_replace('/(^|[\W]+)('.$p.')($|[\W]+)/', '$1<a href="/">$2</a>$3', $val).'<br />'."\r\n"; }
Капни в сторону такого условия: Перед заменяемым словом text должно быть вхождений <a>...</a> 0 или больше раз. Что-то вроде этого, я не проверял: Код (Text): '/(?<=[<a>(.+?)<\/a>]*) (' . $p . ')(.+?)/'