cyberia
@cyberia
Веб-разработчик, плавно перехожу в мобильные разра

Regexp: негативная ретроспективная проверка на принадлежность тегу

Столкнулся с проблемой, необходимо обертывать в ссылки некоторые фразы в документе. Написал регклярку, но вот беда —не могу обработать исключение, когда фраза уже обернута в ссылку.

<?php
$pattern = '#(?<!")('.$phrase.')(?!</a>)(?!</h1>)(?!</h2>)#iu';
$content = preg_replace($pattern, '<a href="'.$link.'" class=«sph»>$1</a>', $content);
?>

Я добавил опережающие проверки, но проблема в том, что если нужной фразы есть еще слова, то проверки не срабатывают. Например фраза из одного слова «Оne»,

<a href="/test/">One</a>

в таком контексте обрабатывается нормально, а в этом случае получаю ссылку в ссылке:

<a href="/test/">One two</a>

Подскажите, как все-таки проверить нет принадлежит ли текст ссылке?
  • Вопрос задан
  • 3760 просмотров
Пригласить эксперта
Ответы на вопрос 4
benipaz
@benipaz
не силен в РНР, но в SQL, если слово представляет часть фразы, то его берут в %. например %One%.
Ответ написан
Kindman
@Kindman
Можно контент разбить (preg_split) на фрагменты по разделителю "<a\s.*?", и потом обработать каждый отдельный элемент разбиения, а в конце, все во-едино склеить.
Ответ написан
shadowjack
@shadowjack
Хм-м, как насчёт чего-нибудь в духе:
$pattern = '#(?<!")[^<>]*('.$phrase.')[^<>]*(?!)(?!)(?!)#iu';
?
Ответ написан
Wott
@Wott
ретроспективная проверка работает с текущей позиции, то есть надо проверять не только
</a>
но и
two</a>
догадайтесь с одного раза как это сделать регуляркой :) подсказываю снаружи тега лучше брать [^<]*

чуть сложнее будет если учитывать всякие span-ы, strong-и и прочие em-ы
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы