Regex для поддержки не в порядке текста - PullRequest
0 голосов
/ 05 октября 2010

У меня есть проблема, которую нужно решить с помощью Regex

Если я использую Firefox или IE8, javascript сгенерирует этот код, который я действительно хочу.

<div style="visibility: hidden;" id="wizardId1">1001</div><div style="visibility: hidden;" id="wizardId2">1002</div>

Однако с IE7 это будетсгенерировать иначе, чтобы быть

<DIV id=wizardId1 style="VISIBILITY: hidden;">1001</DIV><DIV id=wizardId2 style="VISIBILITY: hidden;" >1002</DIV>

, который является идентификатором для div, помещается перед параметром стиля.

В моей Java-программе у меня есть регулярное выражение только для поддержки первого (Firefox & IE8) регулярное выражение

<(?:DIV|div)\s+style=(?:["\'])*(?:[\w\d:; ]+)*(?:["\'])*\s+id=(?:["\'])*([\w\d]+)(?:["\'])*>([\w\d]+)</(?:DIV|div)>

Поскольку IE7 поместил идентификатор перед стилем, чтобы я мог получить желаемый результат, подобный этому

Результат должен появиться

Match 1: <div style="visibility: hidden;" id="wizardId1">1001</div>
    Subgroups:
    1: wizardId1
    2: 1001
Match 2: <div style="visibility: hidden;" id="wizardId2">1002</div>
    Subgroups:
    1: wizardId2
    2: 1002

Я пытался использовать это регулярное выражение (чтобы убрать стиль из регулярного выражения), но результат возвращает только последний идентификатор.

<(?:DIV|div).*\s+id=(?:["\'])*([\w\d]+)(?:["\'])*>([\w\d]+)</(?:DIV|div)>

результат не нужен

Match 1: <div style="visibility: hidden;" id="wizardId1">1001</div><div style="visibility: hidden;" id="wizardId2">1002</div>
    Subgroups:
    1: wizardId2
    2: 1002

Вопрос

Как я могу получить тот же результат, используя регулярное выражение, что и первый результат, не учитывая (style = "visibility: hidden;")?(Не использовать. * И не добавлять дополнительную группу)

Спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 05 октября 2010

Ранее. * Соответствовал всему, начиная с конца первого <div и включая второй <div.

Вы можете попробовать использовать минимальное совпадение.

So

<(?:DIV|div).*?\s+id=(?:["\'])*([\w\d]+)(?:["\'])*[^>]*>([\w\d]+)</(?:DIV|div)>

вместо

<(?:DIV|div).*\s+id=(?:["\'])*([\w\d]+)(?:["\'])*[^>]*>([\w\d]+)</(?:DIV|div)>

Обратите внимание на? после. * означает совпадение как можно меньше.

Я бы рекомендовал не пытаться анализировать HTML с помощью регулярных выражений. Может быть, вы можете попробовать синтаксический анализатор в стиле SAX, например makeSaxParser в http://code.google.com/p/google-caja/source/browse/trunk/src/com/google/caja/plugin/html-sanitizer.js

1 голос
/ 05 октября 2010

Это работает нормально и является довольно общим (я предположил, что вам не нужно проверять атрибут style):

<div.+?id="([^"]+).+?>([^<]+)

Не забудьте включить нечувствительность к регистру, в JavaScript это должно выглядеть так:

/<div.+?id="([^"]+).+?>([^<]+)/i

1 голос
/ 05 октября 2010

Это у вас работает?

<(?:DIV|div)(?:(?:\s+style=(?:["\'])*(?:[\w\d:; ]+)*(?:["\'])*)|(?:\s+id=(?:["\'])*([\w\d]+)(?:["\'])*))*>([\w\d]+)</(?:DIV|div)>
...