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 + **를 사용하는 경우 공백 _and_ 개행 문자가있는 경우 (** \ R \ s + ** 또는 ** \ R \ s * ** 필요). ** \ R **은 개행 문자 (**?> \ r \ n | \ n | \ r **)와 일치합니다. 커뮤니티 위키의 일부로 ** (? 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="([^"]*?)"/> 

비주얼 설명 : 정규 표현식을 넘어 (HTML에 사용되어야하는 경우

Regular expression image Regular expression image

이와 같은 간단한 목록)은 different question (완료되었습니다, T-shirt)입니다.

관련 문제