1

PS: このコードに DOM などを使用することはできません。これは、管理が不十分なサイトからの膨大な数のエラーが含まれている html コードに対して Xpath が機能しないためです。これは私にとって最も簡単な方法です。

エラーのあるhtmlコードからの次のhtmlスニペットがあります。

<td width="11%">Train Number</Td>
<td width="16%">Train Name</td>
<td width="18%">Boarding Date <br>(DD-MM-YYYY)</td>

<td width="7%">From</Td>
<td width="7%">To</Td>
<td width="14%">Reserved Upto</Td>
<td width="21%">Boarding Point</Td>
<td width="6%">Class</Td>
</TR>
<TR>
<TD class="table_border_both">*12018</TD>
<TD class="table_border_both">DEHRADUN SHTBDI</TD>
<TD class="table_border_both"> 9- 9-2012</TD>

<TD class="table_border_both">DDN </TD>
<TD class="table_border_both">RK  </TD>
<TD class="table_border_both">RK  </TD>
<TD class="table_border_both">DDN </TD>
<TD class="table_border_both"> CC</TD>

正規表現を使用して、最後の 8 つの TD の値を取得したいと考えています。したがって、ヒアドキュメント内に配置すると一致しません。このパターン(そのまま)が一致するように、ヒアドキュメント内にどのように配置すればよいですか?

私はこのようにしようとしています:

 $trainpattern = <<<EOT
<td width="11%">Train Number</Td>
<td width="16%">Train Name</td>
<td width="18%">Boarding Date <br>[(]DD-MM-YYYY[)]</td>

<td width="7%">From</Td>
<td width="7%">To</Td>
<td width="14%">Reserved Upto</Td>
<td width="21%">Boarding Point</Td>
<td width="6%">Class</Td>
</TR>
<TR>
<TD class="table_border_both">[*]12018</TD>
<TD class="table_border_both">DEHRADUN SHTBDI</TD>
<TD class="table_border_both"> 9- 9-2012</TD>

<TD class="table_border_both">DDN </TD>
<TD class="table_border_both">RK  </TD>
<TD class="table_border_both">RK  </TD>
<TD class="table_border_both">DDN </TD>
<TD class="table_border_both"> CC</TD>
EOT;


$ret = preg_match("#$trainpattern#s",$filetext,$matches);

また、最初の 2 行だけを取り、それらを \s+ で 1 行に結合すると一致しますが、まったく結合せずに行を一致させる方法を探しています。その場合、\n\r を \s* に置き換える必要があるかもしれません。

4

2 に答える 2

2

値を引き出すには、次のようなものを使用できます。

<?php

// Note: I add <TR></TR> to match

$trainpattern = <<< EOT
<TR>
<td width="11%">Train Number</Td>
<td width="16%">Train Name</td>
<td width="18%">Boarding Date <br>(DD-MM-YYYY)</td>

<td width="7%">From</Td>
<td width="7%">To</Td>
<td width="14%">Reserved Upto</Td>
<td width="21%">Boarding Point</Td>
<td width="6%">Class</Td>
</TR>

<TR>
<TD class="table_border_both">[*]12018</TD>
<TD class="table_border_both">DEHRADUN SHTBDI</TD>
<TD class="table_border_both"> 9- 9-2012</TD>

<TD class="table_border_both">DDN </TD>
<TD class="table_border_both">RK  </TD>
<TD class="table_border_both">RK  </TD>
<TD class="table_border_both">DDN </TD>
<TD class="table_border_both"> CC</TD>
</TR>
EOT;

// $trs will contains each TRs
$trs=array();
preg_match_all("|<tr>(.+)</tr>|Uis", $trainpattern, $trs);

// $keys will contains TD's value of first TR
preg_match_all("|<td.*>(.+)</td>|Uis", $trs[1][0], $keys);

// $values will contains TD's value of second TR
preg_match_all("|<td.*>(.+)</td>|Uis", $trs[1][1], $values);

// We join keys and values 
$results = array();
foreach ($keys[1] as $index => $key) {
    if (isset($values[1][$index])) {
       $results[$key] = $values[1][$index];
    }
}

var_dump($results);

これはあなたを示します:

array(8) {
  ["Train Number"]=>
  string(8) "[*]12018"
  ["Train Name"]=>
  string(15) "DEHRADUN SHTBDI"
  ["Boarding Date <br>(DD-MM-YYYY)"]=>
  string(10) " 9- 9-2012"
  ["From"]=>
  string(4) "DDN "
  ["To"]=>
  string(4) "RK  "
  ["Reserved Upto"]=>
  string(4) "RK  "
  ["Boarding Point"]=>
  string(4) "DDN "
  ["Class"]=>
  string(3) " CC"
}
于 2012-09-08T20:40:57.030 に答える
1

phpQueryを試しましたか?jQuery を使用したことがある場合、これは問題になりません。

例 :

require 'phpQuery.php';
phpQuery::newDocumentHTML($trainpattern);
foreach (pq('td')->slice(-8) as $v) {
    $v = pq($v);
    var_dump((string)$v);
    var_dump((string)$v->attr('class'));
    # etc...
}

出力:

string(43) "[*]12018"
string(50) "DEHRADUN SHTBDI"
string(45) " 9- 9-2012"
string(39) "DDN "
string(39) "RK  "
string(39) "RK  "
string(39) "DDN "
string(38) " CC"
于 2012-09-08T20:34:04.227 に答える