【问题标题】:php using curl and preg_match_all [duplicate]php 使用 curl 和 preg_match_all [重复]
【发布时间】:2014-06-19 16:55:20
【问题描述】:

我觉得我错过了什么。我正在使用以下代码从表中提取一些数字。尽管看起来很简单,但我似乎无法打印任何东西。我正在放置我的代码和下表的示例。请帮我找出我的错误。我希望它只打印每个单元格中的数字。

//gets the site
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://site.org');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch); 

//parse the data
preg_match_all('/<td align=right>(\d+?)</td>/', $response, $matches2);

//prints the parsed data
print_r($matches2[0]);

这是表格的示例。

<center><table border=1><tr><th align=left>Address</th><th width=50>0</th><th width=50>1</th><th width=50>2</th><th width=50>3</th><th width=50>4</th><th width=50>5</th><th width=50>6</th><th width=50>7</th><th width=50>8</th><th width=50>9</th></tr><tr><td>N7:0</td>
<td align=right>1</td>
<td align=right>1</td>
<td align=right>1</td>
<td align=right>99</td>
<td align=right>0</td>
<td align=right>0</td>
<td align=right>0</td>
<td align=right>0</td>
<td align=right>0</td>
<td align=right>0</td>
</tr><tr><td>N7:10</td>
<td align=right>0</td>
<td align=right>7300</td>
<td align=right>16400</td>
<td align=right>3300</td>
<td align=right>2200</td>
<td align=right>6100</td>
<td align=right>28000</td>
<td align=right>18000</td>
<td align=right>0</td>
<td align=right>0</td>
</tr></table></center><hr width=25% align=center>

【问题讨论】:

  • 我强烈建议使用 DOMDocument 或类似的基于 DOM 的操作来获取表数据而不是正则表达式。你的生活会轻松很多。

标签: php curl preg-match-all


【解决方案1】:

PHP-Error-Reporting 应该给你一个提示。 我强烈建议在开发过程中将 error_reporting 设置为 E_ALL 并将 display_errors 设置为“on”。这会给你一个提示,为什么你没有得到任何结果:

PHP Warning:  preg_match_all(): Unknown modifier 't'

因此,您应该在正则表达式中的斜杠上添加转义符,因为您将其用作分隔符。

preg_match_all('/<td align=right>(\d+?)<\/td>/', $response, $matches2);

与往常一样,我建议使用另一个分隔符,从而使您的正则表达式更具可读性。我通常选择“~”。这看起来像:

    preg_match_all('~<td align=right>(\d+?)</td>~', $response, $matches2);

【讨论】:

    【解决方案2】:

    试试这个:

    preg_match_all('/<td align=right>(\d+?(\.\d+)?)<\/td>/', $response, $matches2);
    
    print_r($matches2[1]);
    

    注意结束 TD 标记中的正斜杠现在已转义。

    【讨论】:

    • 我看到这显示了整个比赛。我只想输出数字。我需要为此做些什么不同的事情?
    • $matches2 的第一个元素是整个匹配。从那里剩下的元素是捕获。 (在这种情况下,只有一次捕获。)
    • 我明白了...谢谢。
    • 我看到这段代码会提取常规数字。如果表格显示十进制数字,我必须更改什么? IE。 8.4563
    • 响应已更新为小数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    相关资源
    最近更新 更多