Совпадение имени класса HTML, начинающегося с определенного шаблона в строке HTML - PullRequest
0 голосов
/ 26 июня 2018

Я довольно долго искал, чтобы иметь возможность сопоставлять имена некоторых классов, начиная с указанного шаблона в строке HTML. Вот регулярное выражение, которое я наконец-то придумал:

/(?<=(<[^>]*class=("|')(\w|\ |\-)*))((?<= |\'|\")(foo-|-foo)[^ "']*)/gmi

Образец, с которым я работал:

<body>
<div style="margin-left:6px;" class="foo-pink blfoo-pin-foo-kue red yellow bar-green -moz-FF foo-pink moz-FF foo-pink" >
    <fieldset class="foo customClass foo clFieldsBar  bar-try" id="idField foo- bar-dfgdgdfg">         
         <legend><span>Qu'en pensez-vous ?</span></legend>
        < id="idText" class='foo- Comment_text fdgdgdfg -foo-ddede  mso-whitespace' name="nameText barName"></textarea> bar-deded foo-green
    </fieldset>
    class="blue dffsf sdf mso-green foo"
</div>  

Вы можете видеть, что следующий RegEx делает то, что я на самом деле хочу здесь: https://regex101.com/r/6W5AUT/4

Проблема в том, что мне нужно, чтобы регулярное выражение выполнялось в коде Delphi. Однако, когда я делаю это, я получаю следующую ошибку:

утверждение за кадром не фиксированной длины

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

Я пытался преобразовать свой RegEx, используя различные методы (например, \ K для сброса соответствия), и вот что я придумал:

/(<[^>]*class=("|'))(\b(foo)(\w|\-)*)*/gmi

Вы можете увидеть это здесь: https://regex101.com/r/zeQDrK/2

Как видите, он соответствует только первому имени класса каждого атрибута класса в теге.

Теперь уточним, что мне нужно:

  • Сопоставить все вхождения имени класса, которые начинаются с шаблона (это может быть "foo", "-foo" или их комбинация),
  • Должно совпадать только с именами классов, которые есть в html-теге (поэтому вы можете видеть class = "blue dffsf sdf mso-green foo" вне тега HTML),
  • Он должен поддерживать как class = "ClassName1 ClassName2", так и class = 'ClassName1 ClassName2'

Буду признателен за помощь в решении этой проблемы. Спасибо за ваше время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...