我可以将html表移动到PHP数组吗?

我可以将html表移动到PHP数组吗?,php,arrays,html-table,preg-match,Php,Arrays,Html Table,Preg Match,我有一个脚本,它可以卷起一个网页并拉出一张表。我已经到了这样的地步 echo "<table>"; echo $table; echo "</table>; <pre> <table> <tbody id="sortable1"> <tr id="skip_coloring" class="nosort"> <tr> <td class="border_

我有一个脚本,它可以卷起一个网页并拉出一张表。我已经到了这样的地步

echo "<table>";
echo $table;
echo "</table>;
<pre>
  <table>
    <tbody id="sortable1">
      <tr id="skip_coloring" class="nosort">
      <tr>
        <td class="border_even" style="white-space:nowrap">06/20/2011 4:33 PM </td>
        <td class="border_even">
          <strong>user_name, ext</strong>
        </td>
        <td class="border_even"> outside_num </td>
        <td class="border_even"> outgoing </td>
        <td class="border_even"> 12m, 14s </td>
        <td class="border_even"> 12m, 5s </td>
      <tr>
      <tr>
    </tbody>
  </table>
</pre>
但是,
$matches
是一个包含两个索引的数组,表创建的结果的每一页都有一个索引。也许最好试着与表中的每一行进行匹配?我似乎记得这可以用simplexml或其他什么东西来完成,但我还没有做到。感谢您的帮助

编辑

最终使用DOM;这是我现在得到的:

Array
    (
    [0] => 

          Call Date 
    [1] => 

          Call From

.
.
.
    [7] => 







     06/20/2011  4:33 PM






    [8] => 







     user_name <ext>
输出正是我所需要的

$tables = explode("<table>", $html);

$table = $tables[1]; //Part after <table>

$table = explode("</table>", $table);
$table = $table[0]; //Part before </table>, so $table contains your table.
数组
(
[通话日期]=>2011年6月20日下午4:33
[呼叫来源]=>用户名
[呼叫]=>外部\u num
[呼叫类型]=>传出
[通话时间]=>12米,14秒
[通话时间]=>12米,5秒
)

您应该使用DOM解析器而不是正则表达式来解析此HTML。这会让你省去很多头痛

请参见

您需要使用一些功能


不要使用正则表达式。

我会用它来解析html而不是regexp。

您最好使用DomDocument的
加载html
和DomXPath。 我相信这会奏效,但这是未经测试的:

$rows = explode("<tr>", $table);

// $rows[0] = to be neglected, it contains the part before the first <tr>
// $rows[1] = First TR, so your Heading row
//$rows[1-n] = Your data rows.

除了大家建议的DOM文档之外,如果页面的结构保持不变,您还可以使用诸如“explode”之类的自定义函数来解析页面

因此,让我们假设$html=“html内容”

$tables=explode(“,$html);
$table=$tables[1]//分道扬镳
$table=分解(“,$table”);
$table=$table[0]//前面的部分,所以$table包含您的表。
然后

$rows=explode(“,$table);
//$rows[0]=要忽略,它包含第一行之前的部分
//$rows[1]=第一个TR,因此您的标题行
//$rows[1-n]=您的数据行。
所以


对于($i=2;$iAs,每个人都会告诉你不要尝试使用正则表达式解析HTML。HTML不是一种常规语言。尝试使用正则表达式进行解析乍一看可能会奏效,但最明显的是会在以后咬你的屁股:)在loadHTML位,当我还没有将该表从我获取它的页面中分离出来时,我如何包含该表?我现在正在浏览dom手册。我相信您所要做的就是将xpath更改为:
'//tbody[id=“sortable1”]td'
,但我现在不记得了。这是有意义的。我会试试看。我似乎不能让它做很多事情,而是把整个数组放在一个索引中;我尝试在原始查询下面创建一个额外的foreach()来获取行,但它不喜欢$node已经是一个对象。类似于“//div[@id=“main1”]/tr”的查询会显示行吗?哦,刚刚找到了查询函数的一个很好的描述。我会报告更好的结果。谢谢,我想我会使用DOM方法。非常干净!
$label_arr =  array_filter(array_map('trim',$label_arr));
Array
(
    [Call Date] =>  06/20/2011  4:33 PM
    [Call From] =>  user_name <ext>
    [Call To] =>  outside_num
    [Call Type] =>  outgoing
    [Call Time] =>  12m, 14s
    [Talk Time] =>  12m, 5s
)
$dom = new DomDocument();
$dom->loadHTML( $your_table );
$xpath = new DOMXPath( $dom );

$arr = array();
foreach ($xpath->query('//td') as $node) {
    $arr[] = $node->nodeValue;
}
$tables = explode("<table>", $html);

$table = $tables[1]; //Part after <table>

$table = explode("</table>", $table);
$table = $table[0]; //Part before </table>, so $table contains your table.
$rows = explode("<tr>", $table);

// $rows[0] = to be neglected, it contains the part before the first <tr>
// $rows[1] = First TR, so your Heading row
//$rows[1-n] = Your data rows.
for ($i=2; $i<count($rows);$i++){
//process each row Here
}