preg_match_all用于具有区分大小写代码的表

时间:2014-07-09 12:00:21

标签: php preg-match preg-match-all

我试图提取铁路车票数据供内部使用。

总数据看起来像this table

我已使用<td>条件提取了每个preg_match_all内容,但我无法提取教练位置,如此屏幕截图所示

我尝试过以下代码:

<?php
    $result='tables code over here which you can find in pastebin link';
    preg_match_all('/<TD class="table_border_both"><b>(.*)<\/b><\/TD>/s',$result,$matches);
    var_dump($matches);
?>

我得到的垃圾输出如下:

3 个答案:

答案 0 :(得分:0)

您可以使用以下正则表达式:

$re = "/<TD class=\"table_border_both\"><b>([0-9][0-9])\n<\/b><\/TD>/"; 
$str = "<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"1\" class=\"table_border\">\n\n<tr>\n<td colspan=\"9\" class=\"heading_table_top\">Journey Details</td>\n</tr>\n<TR class=\"heading_table\">\n<td width=\"11%\">Train Number</Td>\n<td width=\"16%\">Train Name</td>\n<td width=\"18%\">Boarding Date <br>(DD-MM-YYYY)</td>\n<td width=\"7%\">From</Td>\n<td width=\"7%\">To</Td>\n<td width=\"14%\">Reserved Upto</Td>\n<td width=\"21%\">Boarding Point</Td>\n<td width=\"6%\">Class</Td>\n</TR>\n<TR>\n<TD class=\"table_border_both\">*12559</TD>\n<TD class=\"table_border_both\">SHIV GANGA EXP </TD>\n<TD class=\"table_border_both\"> 5- 7-2014</TD>\n<TD class=\"table_border_both\">BSB </TD>\n<TD class=\"table_border_both\">NDLS</TD>\n<TD class=\"table_border_both\">NDLS</TD>\n<TD class=\"table_border_both\">BSB </TD>\n<TD class=\"table_border_both\"> SL</TD>\n</TR>\n</table>\n<TABLE width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"1\" class=\"table_border\" id=\"center_table\" >\n\n<TR>\n<td width=\"25%\" class=\"heading_table_top\">S. No.</td>\n<td width=\"45%\" class=\"heading_table_top\">Booking Status <br /> (Coach No , Berth No., Quota)</td>\n<td width=\"30%\" class=\"heading_table_top\">* Current Status <br />(Coach No , Berth No.)</td>\n<td width=\"30%\" class=\"heading_table_top\">Coach Position</td>\n</TR>\n<TR>\n<TD class=\"table_border_both\"><B>Passenger 1</B></TD>\n<TD class=\"table_border_both\"><B>S1  , 33,CK    </B></TD>\n<TD class=\"table_border_both\"><B>S1  , 33</B></TD>\n<TD class=\"table_border_both\"><b>11\n</b></TD>\n</TR>\n<TR>\n<TD class=\"table_border_both\"><B>Passenger 2</B></TD>\n<TD class=\"table_border_both\"><B>S1  , 34,CK    </B></TD>\n<TD class=\"table_border_both\"><B>S1  , 34</B></TD>\n<TD class=\"table_border_both\"><b>11\n</b></TD>\n</TR>\n<TR>\n<TD class=\"table_border_both\"><B>Passenger 3</B></TD>\n<TD class=\"table_border_both\"><B>S1  , 36,CK    </B></TD>\n<TD class=\"table_border_both\"><B>S1  , 36</B></TD>\n<TD class=\"table_border_both\"><b>11\n</b></TD>\n</TR>\n<TR>\n<TD class=\"table_border_both\"><B>Passenger 4</B></TD>\n<TD class=\"table_border_both\"><B>S1  , 37,CK    </B></TD>\n<TD class=\"table_border_both\"><B>S1  , 37</B></TD>\n<TD class=\"table_border_both\"><b>11\n</b></TD>\n</TR>\n<TR>\n<td class=\"heading_table_top\">Charting Status</td>\n<TD colspan=\"3\" align=\"middle\" valign=\"middle\" class=\"table_border_both\">   CHART PREPARED   </TD>\n</TR>\n<TR>\n<td colspan=\"4\"><font color=\"#1219e8\" size=\"1\"><b> * Please Note that in case the Final Charts have not been prepared, the Current Status might upgrade/downgrade at a later stage.</font></b></Td>\n</TR>\n</table>"; 

preg_match_all($re, $str, $matches);

最有用的正则表达式网站:http://regex101.com/

答案 1 :(得分:0)

$regexp = '/<td class="table_border_both"><b>(.*)\s*<\/b><\/td>/gi';

你可以在&#34;教练位置&#34; <td>你忘了在regexp中提到它。 最好使用\s*,所以如果你有空格或线刹,它就不会失败。


你知道你有4列,因此regexp的结果会有进一步的转换:

$data = array_chunk($matches, 4); // split up the matches by rows

而且你已经准备好了行......还有更多的行,而且你有更多的行:

$data = array_map(function (array $row) {
    return array_combine(['snum', 'status_book', 'status_cur', 'position'], $row);
}, $data); // assign each column in the row it's name

如果我们合并所有代码,它可能看起来像这样:

$data = array_map(function (array $row) {
    return array_combine(['snum', 'status_book', 'status_cur', 'position'], $row);
}, array_chunk($matches, 4));

答案 2 :(得分:0)

需要使用\s+,因为行中有一些空格,否则将无法匹配

$data = file_get_contents("http://pastebin.com/raw.php?i=zJrvq95H");
preg_match_all("#<b>([0-9]{0,})\s+<\/b>#", $data, $matches);
print_r($matches[1]);

结果:

Array
(
    [0] => 11
    [1] => 11
    [2] => 11
    [3] => 11
)