2012-05-13 2 views
2

Я пытаюсь сопоставить многострочный HTML-код с регулярным выражением (используя AutoIt). HTML исходный код, чтобы соответствовать:Многострочное регулярное выражение в Autoit3

<li class="mission"> 
    <div> 
     <div class="missionTitle"> 
      <h3>Eat a quarter-pounder with cheese</h3> 
      <div class="missionProgress"> 
       <span>100%</span> 
       <div class="missionProgressBar" style="width: 100%;"></div> 
      </div> 
     </div> 
     <div class="missionDetails"> 
      <ul class="missionRewards"> 
       <li class="rewardCash">5,000&ndash;8,000</li> 
       <li class="rewardXP">XP +5</li> 
           </ul> 
          <div class="fightItems clearfix"> 
       <h5><span>Prerequisites:</span></h5> 
            <div class="fightItemsWrap"> 
              <div class="fightItem tooltip" title="Sunglasses" data-attack="Attack: 2" data-defence="Defence: 2"> 
         <img src="/img/enhancement/3.jpg" alt=""> 
         <span>&times; 1</span> 
        </div> 
              <div class="fightItem tooltip" title="Broad Shoulders" data-attack="Attack: 0" data-defence="Defence: 3"> 
         <img src="/img/enhancement/1003.jpg" alt=""> 
         <span>&times; 1</span> 
        </div> 
              <div class="fightItem tooltip" title="Irish Fond Anglia" data-attack="Attack: 4" data-defence="Defence: 8"> 
         <img src="/img/enhancement/2004.jpg" alt=""> 
         <span>&times; 1</span> 
        </div> 
             </div> 
      </div> 
          <form action="/quest/index/i/kdKJBrgjdGWKqtfDrHEkRM2duXVn1ntH/h/c0b2d58642cd862bfad47abf7110042e/t/1336917311" method="post"> 
       <input type="hidden" id="id" name="id" value="17"/> 
       <button class="button buttonIcon btnEnergy"><em>5</em></button> 
      </form> 
     </div> 
    </div> 
</li> 

Он присутствует несколько раз на одной странице (но элементы в <div class="fightItems clearfix">...</div> варьируются).

  • Мне нужно, чтобы соответствовать
    • <h3>Eat a quarter-pounder with cheese</h3>,
    • первый пролет <span>100%</span> и
    • <input type="hidden" id="id" name="id" value="17"/>.

Ожидаемый результат (для каждого появления на странице):

$a[0] = "Eat a quarter-pounder with cheese" 
$a[1] = "100%" 
$a[2] = "17" 

То, что я придумал:

(?U)(?:<div class="missionTitle">\s+<h3>(.*)</h3>\s+<div class="missionProgress">\s+<span>(.*)</span>)|(?:<form .*\s+.*<input\stype="hidden"\sid="id"\sname="id"\svalue="(\d+)"/>\s+.*\s+</form>) 

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

+1

Я не знаком с autoit, но посмотрите, есть ли у него поддержка html/xml. Вам будет гораздо лучше использовать правильный парсер. – carlpett

+0

В следующий раз я бы не использовал регулярное выражение для этой цели. А скорее цикл for, который выполняет итерацию по каждой строке строки и принимает действие, основанное на том, существует ли определенная подстрока. Это немного более гибко. –

ответ

0

Проблема исправлена. Я не должен использовать точку для соответствия словам или целым числам из-за флага (? S). Правильное регулярное выражение:

(?U)(?s)<div class="missionTitle">\s+<h3>([\w\s]+)</h3>(?:.*)<div class="missionProgress">\s+<span>(\d+)%</span>(?:.*)<input.* value="(\d+)"/> 
+0

Точечное совпадение слов и целых чисел. Проблема заключалась в ** (?:) ** (не захватывающая группа) и использовании _only_ ** \ s + **, где присутствуют пробелы _ и символы новой строки (** \ R \ s + ** или ** \ R \ s * **). ** \ R ** соответствует символам новой строки (**?> \ R \ n | \ n | \ r **). Поскольку часть Wiki сообщества стоит отметить регулярное выражение в совпадениях ответов из-за ** (? S) ** с точками, включая символы новой строки. [источник] (https://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm) @Matt – user4157124

0

Регулярное выражение для сравнения нескольких строк исходного HTML код:

  • Согласно documentation;

    • \R спички символы новой строки (?>\r\n|\n|\r),
    • точка . не не (если (?s) установлен).
    • \s соответствует символам пробела.
  • Обычно какая-либо комбинация (как \R\s*?).

  • Группы, не связанные с захватом, являются избыточными (вместо них вместо этого выполняется совпадение).
  • Если в единственном экземпляре исключены одиночные символы (например, attribute="([^"]*?)" для текста между двойными кавычками).

Пример (содержит двойные кавычки, лечить согласно Documentation - FAQ - double quotes):

(?s)<div class="missionTitle">.*?<h3>(.*?)</h3>.*?<div class="missionProgress">.*?<span>([^<]*?)</span>.*?<input type="hidden" id="id" name="id" value="([^"]*?)"/> 

Визуальное объяснение:

Regular expression image Regular expression image

Если регулярные выражения должны быть использованы на HTML (за простые списки, подобные этому) является different question (было, сделано, T-shirt).

Смежные вопросы