2016-02-18 2 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); 

Эта вещь может выглядеть подавляющим, на первый взгляд, но построенный по частям.

Ok, позволяет пройти через это один за другим:

  • если захватывающая группа начинается с (?P<name_of_the_capturing_group>(regexp))
    • где регулярное выражение является частью вы хотите, чтобы захватить для этой группы
  • вам хотите захватить содержимое внутри тега td, поэтому вы помещаете группу внутри td
  • за каждым тегом td следуют пробелы \s+
  • Теперь 3 регулярных выражений частей для захвата групп
    • Дата (\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); он должен содержать ключи для даты, категории и статуса.

Всегда помните: только Чак Норрис может анализировать HTML с регулярным выражением.

+0

спасибо, что поможет мне много –

+1

PD я могу разобрать HTML йоту регулярное выражение;) смотрите>/\ <тр класс \ = \ ".txt \" \> \ с * (*) <\/td>.? (. *?) <\/td> (. *?) <\/td>/mi –

+0

;) рад, что я мог бы немного помочь –

0

Еще раз, регулярное выражение не инструмент для анализа HTML. Используйте встроенные инструменты DOMDocument и DOMXPath, предназначенные для.

$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); 
Смежные вопросы