2012-05-13 18 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 1として
    • \Rマッチ改行文字を(?>\r\n|\n|\r)
    • ドット.(?s)が設定されていない限り)しません。
    • \sは空白文字と一致します。
  • 通常、いくつかの組み合わせが必要です(\R\s*?など)。

  • 非キャプチャグループは冗長です(代わりにキャプチャなしで一致)。
  • 一意に囲まれている場合は、代わりに1文字を除外することができます(二重引用符で囲んだテキストの場合はattribute="([^"]*?)"など)。

例(二重引用符が含まれています。Documentation - FAQ - double quotesあたりとして扱う):

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

ビジュアル説明:正規表現を超えて(HTMLで使用する必要がある場合

Regular expression image Regular expression image

このような単純なリスト)はdifferent question(完了、完了、T-shirt)です。