2016-09-23 6 views
2

У меня возникли трудности с использованием RegExp для поиска текста между тегами HTML. Это функция поиска для поиска текста на HTML-странице без поиска символов в качестве совпадений в тегах или атрибутах HTML. Когда совпадение найдено, я окружаю его с помощью div и назначаю ему класс выделения, чтобы выделить слова поиска на странице HTML. Если RegExp также совпадает с тегами или атрибутами, код HTML становится поврежденным.RegExp для поиска текста внутри HTML-тегов

Вот HTML код:

<html> 
<span>assigned</span> 
<span>Assigned > to</span> 

<span>assigned > to</span> 

<div>ticket assigned to</div> 

<div id="assigned" class="assignedClass">Ticket being assigned to</div> 

</html> 

и текущий RegExp Я придумал это:

назначен (\ <?!) ((< = (>)?)? !>)/gi

который соответствует, если назначен, или назначено начало текста в теге, но не на других. Он отлично справляется с игнорированием атрибутов и тегов, но не работает, если текст не начинается с строки поиска.

Может ли кто-нибудь помочь мне здесь? Я работал над этим в течение часа в настоящее время, но может»найти решение (RegExp нуб здесь ..)

UPDATE 2

https://regex101.com/r/ZwXr4Y/1 показать оставшиеся проблемы в отношении HTML сущностей и HTML комментарии.

При поиске проблемы осталось то, что &nbsp; не игнорируется, весь текст внутри объектов HTML и комментариев следует игнорировать. Поэтому при поиске «b» он не должен совпадать с &nbsp;, даже если HTML-объект правильно находится между тегами HTML.

+0

Поиск текста между '>' и следующий '<' - что-то вроде этого: '/> (? [\ Ш>] +) sideroxylon

ответ

1

Update # 2

Regex:

(<)(script[^>]*>[^<]*(?:<(?!\/script>)[^<]*)*<\/script>|\/?\b[^<>]+>|!(?:--\s*(?:(?:\[if\s*!IE]>\s*-->)?[^-]*(?:-(?!->)-*[^-]*)*)--|\[CDATA[^\]]*(?:](?!]>)[^\]]*)*]])>)|(e) 

Использование:

html.replace(/.../g, function(match, p1, p2, p3) { 
    return p3 ? "<div class=\"highlight\">" + p3 + "</div>" : match; 
}) 

Live demo

Объяснение:

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

  • Захватывает все <script> тегов и их содержимое
  • захватывают все CDATA блоков
  • захватывает все HTML-тег (открытие/закрытие)
  • Захватывает все HTML-комментарий (а также IE, если условные заявления)
  • захватывает все целевых строк, определенных в последней группе внутри остального текста (здесь (e))

Это позволяет нам быстро манипулировать нашей целью. Например. Оберните его в теги, как показано в разделе использования.Говоря о производительности, я попытался написать ее, чтобы хорошо работать.

Этот RegEx не предоставляет 100% гарантию соответствия правильных позиций (99%), но большую часть времени он должен давать ожидаемые результаты и может легко модифицироваться позже.

+0

Это работает намного лучше, спасибо! Но если вы ищите «s», теперь он помечен дважды, потому что у него есть 2 из них. Таким образом, ss выделяется. Можно ли остановиться после первого матча? Таким образом, только «s» сопоставляется (но соответствует для каждого экземпляра в HTML, не только один раз)? –

+0

Когда вы ищите '' 'так уверенно, вы имеете в виду все' '' письма. Почему вы должны выделить только один '' '' '' '' 'писем? – revo

+0

Извините! Вы абсолютно правы. Еще одна проблема заключается в том, что текст также не может быть внутри тегов CDATA, // , потому что тогда мое изменение текста нарушает сценарий. Можете ли вы мне помочь? –

-1

попробовать это

Live Demo

string.match(/<.{1,15}>(.*?)<\/.{1,15}>/g) 

< это означает. {} 1,15> (. *?) < /. {} 1,15> что-нибудь, что между HTML тега

<any> Content </any> 

будет цель или результат, например

<div> this is the content </content> 

"это содержание" это результат

Смежные вопросы