2015-07-13 2 views
1

У меня есть содержание HTML, как это:регулярное выражение: игнорировать HTML-теги

<p>The bedding was hardly <strong>able to cover</strong> it and seemed ready to slide off any moment.</p>

Вот полная версия HTML. http://collabedit.com/gkuc2

мне нужно искать строку hardly able to cover (просто пример), я хочу, чтобы игнорировать любые HTML-теги внутри строки, я ищу. Потому что в файле HTML есть теги HTML внутри строки, и простой поиск не найдет его.

Прецедент есть: У меня есть две версии файла:

  • HTML-файл с текстом и тегами
  • Тот же файл, но только с необработанным текстом (удалены любые теги и дополнительные пробелы)

Подстрока, которую я хочу найти (игла), из текстовой версии (которая не содержит никакого HTML-тега), и я хочу найти ее позицию в HTML-версии (файл, который имеет теги).

Какое регулярное выражение будет работать?

+0

Где ваш 'Complete' HTML – Tushar

+2

простой: вы не используете регулярные выражения. regexes + html = плохая идея. используйте парсер DOM или разделите ВСЕ теги, а затем регулярное выражение на открытый текст. –

+0

Как сказал @MarcB, обычно это не то место, где вы бы использовали RegEx. если вы ищете простую находку, вы можете попробовать поставить '(. *)' между каждым словом, которое вы ищете. это может работать только на 40%, хотя: «вряд ли (. *) возможно (. *) до (. *) cover' –

ответ

3

Надень между буквами:

(?:<[^>]+>)* 

и заменить пространства с:

(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)* 

Like:

h(?:<[^>]+>)*a(?:<[^>]+>)*r(?:<[^>]+>)*d(?:<[^>]+>)*l(?:<[^>]+>)*y(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)*a(?:<[^>]+>)*b(?:<[^>]+>)*l(?:<[^>]+>)*e(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)*t(?:<[^>]+>)*o(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)*c(?:<[^>]+>)*o(?:<[^>]+>)*v(?:<[^>]+>)*e(?:<[^>]+>)*r 

вам нужны только между каждой буквой, если вы хотите разрешить теги сломать слова, как: This is b<b>old</b>

Это он без буквы перерыва:

hardly(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)*able(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)*to(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)*cover 

Это должно работать для большинства случаев. Однако, если Html искажен, в котором < или> не htmlencoded, вы можете столкнуться с проблемами. Также он может сломать блоки скриптов или другие элементы с разделами CDATA.

+0

Регулярное выражение работает, но вы можете объяснить шаблон? Тот, у кого письмо перерыв. Мне очень трудно читать и понимать. – Amaynut

+0

Разрыв букв - это просто поиск одного или нескольких тегов, который представляет собой '<', за которым следуют еще один символ, который не является '>', а затем '>' –

+0

. Что я не понимаю, почему вы ищете символ, который не является '>' вместо '.', который будет соответствовать любому символу. Я тестировал с символом точки, и он отлично работает. Поэтому вместо '(?: <[^>] +>) *' I put '(?: <.+>) *'. Почему первое было бы лучше, чем последнее? – Amaynut

0

Попробуйте сохранить текст в переменной или что-то в этом роде, а затем удалите все теги и выполните обычный поиск. Вы можете использовать простую функцию php strip_tags().

EDIT: Таким образом, вы могли бы попытаться посмотреть на первые и последние слова (или только первый, а затем играть с остальной частью результата), чтобы найти строку, а затем разобрать результат и удалить теги и проверьте, это тот, который вы ищете. Как использовать regex: чуть ли. обложка или даже трудно. $ И сохранение местоположения каждого результата. Затем используйте strip_tags() по результатам и проанализируйте каждый результат, если он тот, который вы хотите. Я знаю, что это своего рода странно решение, но вы можете избежать бесконечных регулярных выражений и т.д.

+0

У меня уже есть текстовая версия файла, на самом деле мне нужно найти позицию подстроки, взятой из текстовой версии внутри HTML-версии. Поэтому, если я нахожу свою подстроку в виде текстовой версии, это не поможет, потому что я уже знаю, что это позиция в текстовой версии. – Amaynut

+0

О, я вижу сейчас жаль. – Hitokage

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