2012-05-13 41 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 **)。由於**(?s)**具有包含換行符的點,因此由於部分社區Wiki,因此值得注意的是在回答匹配中的正則表達式。 [源](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)。