Regex для соответствия ключевым словам, которые не входят в <a>теги или атрибуты alt</a>

Вопрос:

Я пытаюсь создать регулярное выражение для соответствия ключевым словам в блоке текста. Затем эти ключевые слова будут добавлены к ним. Любое ключевое слово, которое уже находится в пределах ссылки, не должно совпадать.

Я нашел сообщение, которое получило мне 90% пути — PHP Регулярное выражение для соответствия ключевому слову вне HTML-тега <a>

Решение позволяет сопоставить любое ключевое слово в атрибуте img alt, разрушая теги img. Есть ли способ изменить регулярное выражение, чтобы запретить ключевые слова в атрибутах alt?

Вот регулярное выражение (в PHP) у меня есть сейчас:

$content = preg_replace(' ~'.$keyword.'(?!(?>[^<]*(?:<(?!/?a\b)[^<]*)*)</a>)~i', '<a href="'.$url.'">$0</a>', $content);

У меня есть массив ключевых слов /URL-адресов, например

'consectetur' => '/path/to/consectetur'

Поэтому, если бы у меня был этот текст:

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Ключевое слово «consectetur» следует заменить следующим:

<a href="/path/to/consectetur">consectetur</a>

Но нет, если он появится здесь:

<img src="..." alt="consectetur adipisicing elit">

или здесь:

<a href="">Lorem ipsum dolor sit amet, consectetur adipisicing elit.</a>

Лучший ответ:

добавив еще один взгляд после вашего поискового запроса? это очень запутанный образец, но похоже, что он сработает:

Word(?![^<]*?>)(?!(?>[^<]*(?:<(?!/?a\b)[^<]*)*)</a>)

Объяснение:

Word
(?!         # that is not followed by
[^<]*       # zero or more of anything anything that is not <
?>          # lazily up to >
)           # end lookahead

в <span class="Word">, [^<]*?> соответствует "> и терпит неудачу из-за lookahead.

в <a href="/Word" alt="Word">, [^<]*?> соответствует " alt="Word"> и не выполняется.

эта часть выражения я оставлю для плаката из потока, которому он должен объяснять, так как я не совсем уверен в нескольких элементах в нем.

(?!(?>[^<]*(?:<(?!/?a\b)[^<]*)*)</a>)

Оцените статью
TechArks.Ru
Добавить комментарий