Регулярное выражение соответствует нескольким строкам до и после слова, разделенного начальным и конечным словами - PullRequest
0 голосов
/ 20 апреля 2020

Я хочу найти {{ upc }} и начать захват не с <div непосредственно перед матчем, а на 2 <div перед матчем, т.е. <div class="form-group"> и захватить не до первого </div> после совпадения, но 2-го, т.е. закрытия </div> или до начала следующего <div class="form-group"> (в зависимости от того, как вы на него смотрите)

Вот пример шаблона HTML / Twig, который я хочу поиск и замена.

<div class="form-group">
    <label class="col-sm-2 control-label" for="input-sku"><span data-toggle="tooltip" title="{{ help_sku }}">{{ entry_sku }}</span></label>
    <div class="col-sm-10">
        <input type="text" name="sku" value="{{ sku }}" placeholder="{{ entry_sku }}" id="input-sku" class="form-control"/>
    </div>
</div>
<div class="form-group">
     <label class="col-sm-2 control-label" for="input-upc"><span data-toggle="tooltip" title="{{ help_upc }}">{{ entry_upc }}</span></label>
     <div class="col-sm-10">
         <input type="text" name="upc" value="{{ upc }}" placeholder="{{ entry_upc }}" id="input-upc" class="form-control"/>
     </div>
</div>
<div class="form-group">
     <label class="col-sm-2 control-label" for="input-ean"><span data-toggle="tooltip" title="{{ help_ean }}">{{ entry_ean }}</span></label>
     <div class="col-sm-10">
         <input type="text" name="ean" value="{{ ean }}" placeholder="{{ entry_ean }}" id="input-ean" class="form-control"/>
     </div>
</div>

Ожидаемое совпадение с регулярным выражением выглядит следующим образом:

<div class="form-group">
     <label class="col-sm-2 control-label" for="input-upc"><span data-toggle="tooltip" title="{{ help_upc }}">{{ entry_upc }}</span></label>
     <div class="col-sm-10">
         <input type="text" name="upc" value="{{ upc }}" placeholder="{{ entry_upc }}" id="input-upc" class="form-control"/>
     </div>
</div>

Вся помощь приветствуется. Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Одна вещь, которую вы можете попробовать, - это использовать отрицательный взгляд, чтобы отфильтровать вещи, которые вы не хотите sh включить в ваш матч. Например, соответствие <div, за которым следует что угодно, а затем еще один <div, может соответствовать вещам типа <div></div><div>.

Вместо этого вы можете сказать, что соответствует <div, за которым следует что угодно - при условии, что это не </div> - а затем еще один <div.

<div    (?:(?!</div>).)*    <div

Затем вы можете вставить этот же подшаблон в любое место вашего выражения, где вы обычно пишете .*. В этом конкретном случае вы можете повторить это, чтобы убедиться, что вы не нажмете закрывающий div перед тем, как UPC и , а затем продолжите с частью {{ UPC }}.

<div(?:(?!</div>).)*<div    (?:(?!</div>).)*    {{ upc }}    .*?</div>\s*</div>

Вот демоверсия

0 голосов
/ 20 апреля 2020

Вам нужно проанализировать div, что вы хотите, а затем поглотить все внутри них и исключить все остальное.

[\w\W] означает совпадение слов и неслов. Например, он соответствует символам новой строки, а * - нет.

[\w\W]*(<div[\w\W]*?<div[\w\W]*?{{ sku }}[\w\W]*?<\/div>[\w\W]*?<\/div>)[\w\W]*

...