2016-02-18 92 views
1

我需要一個正則表達式來提取指定的值,但不起作用。用RegEx提取特定輸出的具體數據

的HTML代碼是下一個:

<body style="background: #FFF; padding-left: 5px;"> 
    <form name="form1" method="post" action="verify()" id="form1"> 
     <div> 
      <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/asdasfafasf/9Q2w==" /> 
     </div> 
     <div> 
      <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAwKb/LCHCALs0bLrBgKM54rGBulKe8VRM9SNhTfqyz0GubMFea7i" /> 
     </div> 
     <div class="nicer"> 
      <input name="TextBox1" type="text" value="asdf44" id="TextBox1" placeholder="Ingresa tu patente" /> 
     </div> 
     <p class="sample"> 
      <br /> sample: asdasd34 &oacute; ABCD12 
      <br /> Para . Ej. AB<strong style="font-weight: bold !importand;">0</strong>123</p> 
     <p> 
      <input type="submit" name="Button1" value="Consultar" id="Button1" class="button orange_btn small_btn" /> 
     </p> 
     <h3><span id="Label1" class="infractions_report">result: asdf44</span></h3> 
     <div> 
      <table cellspacing="0" rules="all" border="1" id="GridView1" style="border-collapse:collapse;"> 
       <tr> 
        <th scope="col">date</th> 
        <th scope="col">category</th> 
        <th scope="col">statusok</th> 
       </tr> 
       <tr class="txt"> 
        <td>10-08-2015</td> 
        <td>1</td> 
        <td>cs nor</td> 
       </tr> 
       <tr class="txt"> 
        <td>04-08-2015</td> 
        <td>1</td> 
        <td>cs nor2</td> 
       </tr> 
       <tr class="txt"> 
        <td>01-08-2015</td> 
        <td>1</td> 
        <td>cs nor3</td> 
       </tr> 
       <tr class="txt"> 
        <td>30-07-2015</td> 
        <td>1</td> 
        <td>cs nor4</td> 
       </tr> 
       <tr class="txt"> 
        <td>19-06-2015</td> 
        <td>1</td> 
        <td>cn nor5</td> 
       </tr> 
      </table> 
     </div> 
    </form> 
</body> 

PHP代碼是下一個:

$expresiondate = '/\<tr\>[\s]*\<td class\=\"txt\"\>[\s]*([^\s\<\/]*)/is'; 
preg_match_all($expresiondate , $buffer, $exit1); 

$expresionCategory= '/\-[\d]{4}[\s]*<\/td\>[\s]*\<td class\=\"txt\"\>[\s]*([^\s\<\/]*)/is'; 
preg_match_all($expresionCategory, $buffer, $exit2); 

$expresionstatus= '/\>[\s]*[\d]*[\s]*<\/td\>[\s]*\<td class\=\"txt\"\>[\s]*([^\s\<\/]*)/is'; 
preg_match_all($expresionstatus, $buffer, $exit3); 

我所需要的結果是下一個(例如值,但這個輸出):

1. date: 
array (
    0 => 
    array (
    0 => '<td align="center">15/01/2016 00:22:16</td>', 
    1 => '<td align="center">16/01/2016 00:22:16</td>', 
    2 => '<td align="center">11/01/2015 00:22:16</td>', 
), 
    1 => 
    array (
    0 => '15/01/2016', 
    1 => '16/01/2016', 
    2 => '11/01/2015', 
), 
) 

2. category 
array (
    0 => 
    array (
    0 => '<td>10-08-2015</td><td>1</td><td>cs nor</td>', 
    1 => '<td>10-08-2015</td><td>1</td><td>cs nor</td>', 
    2 => '<td>10-08-2015</td><td>1</td><td>cs nor</td>', 
), 
    1 => 
    array (
    0 => '1', 
    1 => '1', 
    2 => '1', 
), 
) 

3.status 
array (
    0 => 
    array (
    0 => '<td>10-08-2015</td><td>1</td><td>cs nor</td>', 
    1 => '<td>10-08-2015</td><td>1</td><td>cs nor</td>', 
    2 => '<td>10-08-2015</td><td>1</td><td>cs nor</td>', 
), 
    1 => 
    array (
    0 => 'cn nor1', 
    1 => 'cn nor2', 
    2 => 'cn nor3, 
), 
) 

回答

0

正則表達式是很難解釋..

我會建議使用「命名捕獲組」來刮取表格單元格中的內容。

我想出了下面的正則表達式:

$regexp = "/<td>(?P<data>(\d{2}-\d{2}-\d{4}))<\/td>\s+<td>(?P<category>\d{1})<\/td>\s+<td>(?P<status>.*)<\/td>/mi"; 
preg_match_all($regexp, $input_lines, $matches); 

那東西看起來勢不可擋一見鍾情,但其部分構成。

好吧,讓一個經歷這一個:

  • 捕獲組與(?P<name_of_the_capturing_group>(regexp))
    • 這裏正則表達式是要捕獲該組
  • 你的部分開始想要捕獲td標籤內的內容,因此一個將組放置在td標籤後面的每個td標籤之後是空格\s+
  • 現在3的regexp份
  • 用於捕獲組
    • 日期(\d{2}-\d{2}-\d{4})
      • 符合條件:兩個數字減去兩個數字減去4位數字
      • 捕獲組= (?P<date>(\d{2}-\d{2}-\d{4}))
    • 類別\d{1}
      • 只是一個單一的數字
      • 捕獲組= (?P<category>\d{1})
    • 狀態.*
      • 匹配所有,混合
      • 捕獲組= (?P<status>.*)

運行後preg_match_all只是var_dump($matches);它應該包含日期,類別和狀態的鍵。

永遠記住:只有Chuck Norris可以用正則表達式解析HTML。

+0

謝謝,這幫助了我很多 –

+1

PD我可以解析HTML絲毫的正則表達式;)看>/\ ​​? (。*?)<\/td>​​(。*?)<\/td>/mi –

+0

;)很高興我可以幫忙一下 –

0

再一次,正則表達式不是解析HTML的工具。使用專爲之設計的內置工具DOMDocumentDOMXPath

$url = 'page.html'; 

libxml_use_internal_errors(true); 
$dom = new DOMDocument; 
$dom->loadHTMLFile($url); 

$xp = new DOMXPath($dom); 
$rowNodeList = $xp->query('//table[@id="GridView1"]/tr[@class="txt"]'); 
$results = []; 
foreach ($rowNodeList as $rowNode) { 
    $colNodeList = $rowNode->getElementsByTagName('td'); 
    $results[] = [ 'date'  => $colNodeList->item(0)->nodeValue, 
        'category' => $colNodeList->item(1)->nodeValue, 
        'status' => $colNodeList->item(2)->nodeValue ]; 
} 

libxml_clear_errors(); 

print_r($results);