Home
Далее цитата из письма.

Объясняю. Есть такая штука "Регулярные выражения", которая повзоляет искать что угодно в текстах и заменять на что угодно. Но есть у нее одна особенность — я могу сказать найди мне А перед которым идет Б. Компилятор воспримет это как найди мне Б, после которого идет А (смотрит вперед).

Но я не могу сказать "найди мне А, перед которым НЕ ИДЕТ Б". В частности если Б переменной длины. Тут уже "смотреть вперед" не получится. Тут надо сначала найти А, итока потом проверить, есть перед ним Б или нету. Если нет — удовлетворяет условию, заменяем.

Исключение заголовков работает как "Не заменять контент, который заканчивается на </h1> - </h6>. Поскольку он на него заканчивается, то он ведь-где-то и начиннается. Работаем через "смотреть вперед": ищем нужное слово, и можем посомтреть какой за ним идет контент, в том числе и переменной длинны.

Заголовок новостей заканчивается на </div>, на который може заканчиваться и тот контент, который требуется заменить.

Переменная длинна тут в том, что между <div class="news-single-title"> и заменяемым словом может идти другой контент и его может быть сколько угодно. Я могу поставить так: "Не заменять слово, если перед ним идет <div class="news-single-title">", но смысла в этом нет.

Мораль в следующем. В принципе можно сдлеать так чтобы можно было исключать из процессинга контент между двумя тегами. Например, можно его сначала находить, потом вырезать вообще из обрабатываемой переменной, вставлять на его место
некий маркер, например, MD5-хэш контента, проводить требуемые замены, а потом возвращать вырезанный контент на прежние места.

Но тут есть одна загвоздка. Рекурсивный поиск. Например я говорю: вырезать из контента все что начинается на <div class="news-single-title"> и заканчивается на </div> (типа заголовок). И что он будет делать, если встретит вот такую конструкцию:

<div class="news-single-title">
Решение <div class="aaa">SOLUTION</div> против SOLUTION Drive
</div>

?

Правильно. Вырежет "Решение <div class="aaa">SOLUTION" и на этом успокоится. Чтобы это дело отследить, нужно построить рекурсивный поиск или использовать DOM. Я пока не решил, что эффективнее. То есть он учтет, что был открыт еще
один div и вот этот </div> не является искомым, нам нужен следующий по тексту.

Tags: