регулярное выражение для соответствия тегов HTML с определенными атрибутами - PullRequest
2 голосов
/ 25 января 2012

Я пытаюсь сопоставить все теги HTML, которые не имеют атрибута "term" или "range"

вот пример HTML-формата

<span class="inline prewrap strong">DATE:</span>    12/01/10
<span class="inline prewrap strong">MR:</span>  1234567
<span class="inline prewrap strong">DOB:</span> 12/01/65
<span class="inline prewrap strong">HISTORY OF PRESENT ILLNESS:</span>  Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum

<span class="inline prewrap strong">MEDICATIONS:</span>  <span term="Advil" range="true">Advil </span>and Ibuprofen.

Мое регулярное выражение: <(.*?)((?!\bterm\b).)>

К сожалению, это соответствует всем тэгам ... Было бы неплохо, если бы внутренний текст не совпадал, так как мне нужно отфильтровать все тэги, кроме тех, которые имеют этот специфический атрибут.

Ответы [ 5 ]

10 голосов
/ 26 января 2012

Если для этого вам подходит регулярное выражение, это работает для меня.(Примечание. Фильтрация комментариев, типа документа и других объектов не включена.
Другие предупреждения; теги могут быть встроены в сценарий, комментарии и другие элементы.)

span Тег ( с атрибутом ) без термина | диапазон атрибутов

'<span
  (?=\s)
  (?! (?:[^>"\']|(?>".*?"|\'.*?\'))*? (?<=\s) (?:term|range) \s*= )
  \s+ (?:".*?"|\'.*?\'|[^>]*?)+ 
>'

любой тег ( с атрибутом ) без термина | диапазон атрибутов

'<[A-Za-z_:][\w:.-]*
  (?=\s)
  (?! (?:[^>"\']|(?>".*?"|\'.*?\'))*? (?<=\s) (?:term|range) \s*= )
  \s+ (?:".*?"|\'.*?\'|[^>]*?)+ 
>'

любой тег (* 1031)* без атрибута ) без термина | диапазон атрибутов

'<
  (?:
    [A-Za-z_:][\w:.-]*
    (?=\s)
    (?! (?:[^>"\']|(?>".*?"|\'.*?\'))*? (?<=\s) (?:term|range) \s*= )
    \s+ (?:".*?"|\'.*?\'|[^>]*?)+ 
  |
    /?[A-Za-z_:][\w:.-]*\s*/?
  )
>'

Обновление

Альтернатива использованию (?>) конструкции
Ниже приведены регулярные выражения для атрибутов no-'term | range'
Flags = (g) global и (s) dotall

тег span с атрибутом
ссылка: http://regexr.com? 2vrjr
регулярное выражение: <span(?=\s)(?!(?:[^>"\']|"[^"]*"|\'[^\']*\')*?(?<=\s)(?:term|range)\s*=)(?!\s*/?>)\s+(?:".*?"|\'.*?\'|[^>]*?)+>

любой тег с атрибутом
ссылка: http://regexr.com? 2vrju
регулярное выражение: <[A-Za-z_:][\w:.-]*(?=\s)(?!(?:[^>"\']|"[^"]*"|\'[^\']*\')*?(?<=\s)(?:term|range)\s*=)(?!\s*/?>)\s+(?:".*?"|\'.*?\'|[^>]*?)+>

любой тег с атрибутом att или wo / attr
ссылка: http://regexr.com? 2vrk1
регулярное выражение: <(?:[A-Za-z_:][\w:.-]*(?=\s)(?!(?:[^>"\']|"[^"]*"|\'[^\']*\')*?(?<=\s)(?:term|range)\s*=)(?!\s*/?>)\s+(?:".*?"|\'.*?\'|[^>]*?)+|/?[A-Za-z_:][\w:.-]*\s*/?)>

', чтобы соответствовать каждому тегу, кроме тех, которые имеют термин = "иногда"'

ссылка: http://regexr.com? 2vrka
<(?:[A-Za-z_:][\w:.-]*(?=\s)(?!(?:[^>"\']|"[^"]*"|\'[^\']*\')*?(?<=\s)term\s*=\s*(["'])\s*occasionally\s*\1)(?!\s*/?>)\s+(?:".*?"|\'.*?\'|[^>]*?)+|/?[A-Za-z_:][\w:.-]*\s*/?)>

1 голос
/ 25 января 2012

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

/(?! [^>]+ \b(?:item|range)= ) (<[a-z]+.*?>) /igx

Приведенный ниже код демонстрирует этот шаблон в программе Perl

use strict;
use warnings;

my $pattern = qr/ (?! [^>]+ \b(?:item|range)= ) (<[a-z]+.*?>) /ix;

my $str = <<'END';

<span class="inline prewrap strong">DATE:</span>    12/01/10
<span class="inline prewrap strong">MR:</span>  1234567
<span class="inline prewrap strong">DOB:</span> 12/01/65
<span class="inline prewrap strong">HISTORY OF PRESENT ILLNESS:</span>  Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum

<span class="inline prewrap strong">MEDICATIONS:</span>  <span term="Advil" range="true">Advil </span>and Ibuprofen.

END

print "$_\n" foreach $str =~ /$pattern/g;

ВЫХОД

<span class="inline prewrap strong">
<span class="inline prewrap strong">
<span class="inline prewrap strong">
<span class="inline prewrap strong">
<span class="inline prewrap strong">
1 голос
/ 25 января 2012

Я думаю, что вы должны использовать анализатор HTML для решения этой проблемы. Создание собственного регулярного выражения возможно, но наверняка ошибочно. Представьте, что ваш код содержит такое выражение

< span      class = "a"              >b< / span         >

Это также верно, но рассмотреть все возможные пробелы и символы табуляции в вашем регулярном выражении будет непросто и потребует тестирования, прежде чем вы сможете быть уверены, что он работает так, как ожидается.

0 голосов
/ 02 августа 2018

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

Это регулярное выражение будет выбирать атрибут стиля любого тега HTML.

<\s*\w*\s*style.*?>

Вы можете проверить это на https://regex101.com

0 голосов
/ 25 января 2012
<\w+\s+(?!term).*?>(.*?)</.*?>
...