Jokerjar79
Advanced Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Пытаюсь реализовать подсветку результатов поиска (под "подсветкой" подразумевается обрамление найденных слов тэгом <span> с опр. стилем). Поиск производится по тексту, в котором может иметься html-разметка. Есть одна тонкость: если искомое слово является тэгом/частью тэга, свойством тэга и т.п., то его подсвечивать не нужно, иначе на странице всплывают наружу куски нарушенной html-разметки. К примеру, в тексте Код: po_1 2_Po 3_pO_ <tag param="noPo4Po5">po6 PO7 po8</tag> po9 po10 | в результате поиска по "po" не должны быть подсвечены Po4 и Po5. Алгоритм вроде ясен: если от начала строки до искомого слова отсутствуют тэги, то подсвечиваем, а также, если от последнего закрытого тэга (>) до искомого слова отсутствует начало другого тэга (<). Код: function highlight($word, $subject) { if ($word == '') return $subject; $qm = quotemeta($word); $pattern = "((^[^<>($qm)]*)|(>[^<($qm)]*))($qm)"; $replacement = '\\1<span style="background-color: yellow">\\4</span>'; return eregi_replace($pattern, $replacement, $subject); } | Но такое регулярное выражение подсвечивает только первое вхождение в тексте до начала html-тэгов, а также по одному вхождению в каждом теле тэга и области между тэгами. Такое рег. выражение делает то же самое, но последнее вхождение: Код: ((^[^<>]*)|(>[^<]*))($qm) | Как сделать, чтобы подсвечивались все вхождения? Пример для теста. При правильном рег. выражении строки в браузере должны быть одинаковы, но во второй все "po" выделены желтым цветом. Спасибо |