2014-12-01 6 views
0

У меня есть этот код HTML-кода, и я пытаюсь разобрать содержимое из div с помощью «очков» «stat-label». Я сделал это для div со значением «stat-label», и он отлично работает.Parse DOM using regex

preg_match('#\$[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]{2})?#', $xx1, $output1); 
$parts1 = $output1[0]; 
$val1 = trim(str_replace('$','',$parts1)); 
$value1= preg_replace('/[\$,]/', '', $val1); 

Но я не могу заставить его прочитать значение «точек». Есть идеи??

Пробовал так:

preg_match('/^\\d+(\\.\\d+)?$/D', $xx1, $output2); 

и результат был:

object(DOMNodeList)#7 (1) { 
    ["length"]=> 
    int(0) 
} 


<div class="widget"> 
    <div class="widget-header"> 

     <!-- content --> 
    </div> 

    <div class="widget-content"> 

     <div class="stat"> 
      <div class="stat-header"> 
       <div class="stat-label"> 
        <!-- content --> 
       </div> 
       <div class="stat-value"> 
        <!-- content --> 
       </div> 
      </div> 
     </div> 
     <hr> 

     <div class="stat"> 
      <div class="stat-header"> 
       <div class="stat-label"> 
        <!-- content --> 
       </div> 
       <div class="stat-value"> 
        <!-- content --> 
       </div> 
      </div> 
     </div> 
     <hr> 

     <div class="stat"> 
      <div class="stat-header"> 
       <div class="stat-label"> 
        <!-- content --> 
       </div> 
       <div class="stat-value"> 
        <!-- content --> 
       </div> 
      </div> 
     </div> 
     <hr> 

     <div class="stat"> 
      <div class="stat-header"> 
       <div class="stat-label"> 
        Amount 
       </div> 
       <div class="stat-value"> 
        <font color="green">$</font>123,456,678,012 </div> 
      </div> 
     </div> 
     <hr> 

     <div class="stat"> 
      <div class="stat-header"> 
       <div class="stat-label"> 
        Points 
       </div> 
       <div class="stat-value"> 
        12.14 </div> 
      </div> 
     </div> 
     <hr> 

     <div class="stat"> 
      <div class="stat-header"> 
       <div class="stat-label"> 
        <!-- content --> 
       </div> 

       <div class="stat-value"> 
        <!-- content --> 
       </div> 
      </div> 
     </div> 
     <hr> 

     <div class="stat"> 
      <div class="stat-header"> 
       <div class="stat-label"> 
        <!-- content --> 
       </div> 
       <div class="stat-value"> 
        <!-- content --> 
       </div> 
      </div> 
     </div> 
    </div> 
</div> 
+1

«[Вы пытались использовать XML-парсер вместо?] (Http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags)" – Scimonster

+1

О, прочитайте этот, вам понравится: [золотая ссылка] (http://stackoverflow.com/a/1732454/2663825) – Dexa

+0

@Dexa ладно, теперь я чувствую, что использую отвертку, чтобы обрезать свою бороду. lol Я полностью понимаю, что мой подход был/ошибочен. Пожалуйста, направьте меня на любые лучшие методы, так как я новичок во всем этом. – wiZZmnma

ответ

0

12.14 обнесена непечатаемых ваш RE не ожидает. Либо trim() это раньше, либо не использовать ^$

0

поэтому, посмотрев на потенциал анализа PHP, я оставил все экземпляры, где я использовал regex для разбора html.

Вот как я решил выше вопрос:

<?php 
$login_data= http_build_query(array('username'=>$username,'password'=>$password)); 
$html = _curl("http://example.com/getinfo.php",'POST',$login_data); // this is a curl function I use 

$dom = new DOMDocument(); 
$dom->loadHTML($html); 
$els = $dom->getElementsByTagName('*'); 
$child = 0; 
$myAmount = 0; 
foreach ($els as $el) { 
    $firstChild = $el->firstChild; 
    $child++; 
if($child == "96"){ // this was the firstChild that has the amount data 
$myAmount = trim($firstChild->wholeText); 
} 

} 

echo $myAmount; // outputs 12.14! 

?> 

Так, ответил его для меня по крайней мере. пожалуйста, обратитесь к ссылкам в комментариях выше.