使用file_get_contents将html表解析为php数组 - php

我试图将here中显示的表解析为多维php数组。我正在使用以下代码,但由于某种原因,它返回一个空数组。在网上搜索后,我发现this site,这是我从中获得parseTable()函数的地方。通过阅读该网站上的评论,我发现该功能运行良好。因此,我假设我从file_get_contents()获取HTML代码的方式存在问题。对我在做什么错有任何想法吗?

<?php

$data = file_get_contents('http://flow935.com/playlist/flowhis.HTM');

function parseTable($html)
{
  // Find the table
  preg_match("/<table.*?>.*?<\/[\s]*table>/s", $html, $table_html);

  // Get title for each row
  preg_match_all("/<th.*?>(.*?)<\/[\s]*th>/", $table_html[0], $matches);
  $row_headers = $matches[1];

  // Iterate each row
  preg_match_all("/<tr.*?>(.*?)<\/[\s]*tr>/s", $table_html[0], $matches);

  $table = array();

  foreach($matches[1] as $row_html)
  {
    preg_match_all("/<td.*?>(.*?)<\/[\s]*td>/", $row_html, $td_matches);
    $row = array();
    for($i=0; $i<count($td_matches[1]); $i++)
    {
      $td = strip_tags(html_entity_decode($td_matches[1][$i]));
      $row[$row_headers[$i]] = $td;
    }

    if(count($row) > 0)
      $table[] = $row;
  }
  return $table;
}

$output = parseTable($data);

print_r($output);

?>

我希望我的输出数组看起来像这样:

1个
-> 11:33 AM
->开发
->黑暗中

2
->上午11:29
->里尔·韦恩
->她会

3
-> 11:26 AM
->卡迪纳尔·OFFISHALL
->数字1(潮汐高)

参考方案

不要让自己用正则表达式来解析HTML!相反,让HTML解析器库为您担心标记的结构。

我建议您检查一下简单HTML DOM(http://simplehtmldom.sourceforge.net/)。它是专门为帮助解决PHP中此类Web抓取问题而编写的库。通过使用这样的库,您可以用更少的代码行编写抓取代码,而不必担心创建有效的正则表达式。

原则上,使用简单HTML DOM,您只需编写如下内容:

$html = file_get_html('http://flow935.com/playlist/flowhis.HTM');
foreach($html->find('tr') as $row) {
   // Parse table row here
}

然后可以将其扩展为以某种格式捕获数据,例如,创建艺术家和相应标题的数组,如下所示:

<?php
require('simple_html_dom.php');

$table = array();

$html = file_get_html('http://flow935.com/playlist/flowhis.HTM');
foreach($html->find('tr') as $row) {
    $time = $row->find('td',0)->plaintext;
    $artist = $row->find('td',1)->plaintext;
    $title = $row->find('td',2)->plaintext;

    $table[$artist][$title] = true;
}

echo '<pre>';
print_r($table);
echo '</pre>';

?>

我们可以看到,可以(平凡地)更改此代码以以其他任何方式重新格式化数据。

如何在codeigniter中检查请求是POST还是GET请求? - php

我只是想知道是否有一种非常简单的方法来确定请求是$_POST还是$_GET请求。那Codeigniter有这样的东西吗?$this->container->isGet(); 参考方案 我从未使用过codeigniter,但为此我检查了$_SERVER['REQUEST_METHOD']。看the docs也许像这样:if ($…

如何通过php标头重定向传递在GET字符串中接收的变量? - php

用户提交表单后,我正在从Aweber接收GET字符串中的值。我将变量发送给我,然后将其提交到SMS网关,以通过短信通知第三方提交。这是我的问题。我需要将在php标头中执行传出SMS命令的页面重定向到另一个页面,该页面最终显示从Aweber发送的GET变量。我可以在第一页中检索变量及其值。如何将它们传递到第二页?这是我在第一页(sms.php)上用来收集Awe…

为什么PHP中的_GET错误地解码了斜杠? - php

今天,我对PHP感到有些奇怪,但我未能在文档中找到正确的解释。考虑以下代码:<?php echo $_GET['t']. PHP_EOL; ?> 代码很简单-它在网址上使用一个t参数并将其输出回来。因此,如果您使用test.php?t =%5Ca(%5c是“ \”)来调用它,我希望看到:\a 但是,这就是我得到的:$ curl…

PHP:检查谁看过发送的电子邮件? - php

我正在向某些用户发送电子邮件,并且想知道是谁阅读的,这意味着如果有人阅读了该电子邮件,则将维护一个日志文件,其中包含该用户的电子邮件地址以及日期/时间/ IP。为此,我发送一个带有电子邮件(html模板)的javascript函数,当用户打开该电子邮件时,它仅会警告用户的电子邮件地址,例如:for($n=0; $n<sizeof($checkBox);…

PHP getallheaders替代 - php

我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…