регулярное выражение для сопоставления тегов html с определенными атрибутами

Я пытаюсь сопоставить все теги HTML, у которых нет атрибута «термин» или «диапазон».

вот пример формата 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).)>

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


person user253530    schedule 25.01.2012    source источник
comment
Не могли бы вы рассказать немного больше о том, что вы пытаетесь сделать? Вы пытаетесь отфильтровать все теги, которые имеют термин или атрибут диапазона, или все теги без термина или атрибута диапазона?   -  person    schedule 25.01.2012
comment
я пытаюсь отфильтровать все теги, которые НЕ имеют атрибута термина и диапазона. По сути, после того, как я выполню replace(), должны оставаться только теги с этими атрибутами.   -  person user253530    schedule 25.01.2012


Ответы (5)


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

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

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

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

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

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

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

Обновить

Альтернатива использованию конструкции (?>)
Ниже приведены регулярные выражения для атрибутов без термина|диапазона
Флаги = (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+(?:".*?"|\'.*?\'|[^>]*?)+>

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

'соответствовать всем тегам, кроме тех, у которых есть term="occasionally"'

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

person Community    schedule 26.01.2012
comment
Здравствуйте, я пробовал ваше регулярное выражение в этом примере regexr.com?2vrg3. Пожалуйста, посмотрите. Кажется, это не соответствует. Попробуйте, например, сопоставить все теги, кроме тех, у которых есть термин = иногда. Это должно дать вам представление о том, чего я пытаюсь достичь. Я до сих пор не исправил это, регулярное выражение, которое я написал, приближается к ожидаемому результату, но терпит неудачу, если есть другой атрибут, кроме термина и диапазона. Спасибо - person user253530; 27.01.2012
comment
@user253530 - 3 проблемы; 1. вы оставили пробелы в регулярном выражении, 2. флаг не установлен, 3. этот движок не любит притяжательную форму (?>exp). Добавлены альтернативные регулярные выражения и ссылки в моем обновлении. - person ; 28.01.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">
person Borodin    schedule 25.01.2012
comment
это не тот результат, который мне нужен :) представьте, если я заменю эти результаты... у меня будет ‹/span› повсюду. Я решил свою проблему, потребовалось некоторое время, но я сделал это. Курсив или прописные, это просто вопрос восприятия. Мне лично нравятся заглавные буквы, потому что они просто выделяются. Некоторые люди более чувствительны к ним... Поскольку мы не используем здесь голос, я думаю, вы заходите слишком далеко, интерпретируя мои заглавные буквы как знак повышения тона. Но эй, мы все живем в нашем маленьком цифровом мире... не так ли? - person user253530; 26.01.2012
comment
Первоначально вы ничего не упомянули об использовании шаблона для выполнения замен. Пожалуйста, покажите свое решение в качестве ответа здесь. - person Borodin; 26.01.2012

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

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

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

person ka3ak    schedule 25.01.2012
comment
Я думаю, что рефлекторная реакция на отказ от регулярных выражений, когда речь идет о XML, в данном случае неуместна. Отдельный тег — это четко определенный элемент, и, помимо тегов, появляющихся в комментарии, его легко найти с помощью регулярного выражения. - person Borodin; 25.01.2012
comment
‹[\s]*?span[^›]*?class[\s]*?=\s*([\'\\s])(.*?)\1[^›]*?› обойти наиболее корректный HTML-код, если вы ищете определенный тег -› класс Группа 2 будет соответствовать имени вашего класса, а группа 1 будет разделителем (', , пробел). Например, все эти: regexr.com?34l34 - person tweak2; 23.04.2013

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

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

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

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

person M.Muzammil    schedule 02.08.2018
comment
Это работает, только если style является первым атрибутом. Это также не сработает, если тег name содержит style. - person CertainPerformance; 02.08.2018
comment
<\s не является допустимым HTML-тегом. - person e-info128; 28.09.2019

person    schedule
comment
Не допускает <tag attribute1="value" term="text"> - person Borodin; 26.01.2012
comment
тоже нет, я создаю тег ‹term=text›, чтобы точно знать, что ищу. нет никаких шансов, что рядом с атрибутом термина будет другой атрибут. - person user253530; 26.01.2012