【问题标题】:php using curl and preg_match_allphp 使用 curl 和 preg_match_all
【发布时间】:2014-06-18 21:32:40
【问题描述】:

所以我想做的是使用 preg_match_all 从下表中提取数字。我试过玩一些正则表达式,但我还没有得到它。我想提取数字并打印出来。 IE。

//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('/[0-9]+(?=[^0-9]+(N7:0<|N7:10<|N7:20))/', $response, $matches);

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

任何帮助都会很棒。

<html><head><title>Monitor</title></head>
<body bgcolor="#ffffff"><center>
<h2><font face="helvetica">Ethernet Processor</font></h2>
<h2><i>Data Table Monitor</i></h2>
<hr width=25% align=center>
<meta HTTP-EQUIV="refresh" CONTENT="15"><body bgcolor="#ffffff"><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><tr><td>N7:20</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>
<td align=right>0</td>
<td align=right>0</td>
<td align=right>0</td>
<td align=right>0</td>
</tr><tr><td>N7:30</td>
<td align=right>16993</td>
<td align=right>29251</td>
<td align=right>28516</td>
<td align=right>25888</td>
<td align=right>20079</td>
<td align=right>29728</td>
<td align=right>18031</td>
<td align=right>30062</td>
<td align=right>25633</td>
<td align=right>0</td>
</tr><tr><td>N7:40</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>
<td align=right>0</td>
<td align=right>0</td>
<td align=right>0</td>
<td align=right>0</td>
</tr><tr><td>N7:50</td>
<td align=right>205</td>
<td align=right>158</td>
<td align=right>152</td>
<td align=right>0</td>
<td align=right>0</td>
<td align=right>79</td>
<td align=right>7</td>
<td align=right>19</td>
<td align=right>0</td>
<td align=right>0</td>
</tr><tr><td>N7:60</td>
<td align=right>0</td>
<td align=right>4000</td>
<td align=right>18000</td>
<td align=right>2500</td>
<td align=right>1750</td>
<td align=right>2000</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:70</td>
<td align=right>0</td>
<td align=right>0</td>
<td align=right>14</td>
<td align=right>0</td>
<td align=right>2210</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:80</td>
<td align=right>363</td>
<td align=right>347</td>
<td align=right>361</td>
<td align=right>0</td>
<td align=right>371</td>
<td align=right>379</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:90</td>
<td align=right>6</td>
<td align=right>474</td>
<td align=right>42</td>
<td align=right>114</td>
<td align=right>408</td>
<td align=right>0</td>
<td align=right>0</td>
<td align=right>0</td>
<td align=right>308</td>
<td align=right>248</td>
</tr></table></center><hr width=25% align=center>

【问题讨论】:

  • 你想达到什么目的?

标签: php curl preg-match-all


【解决方案1】:

我认为你所追求的正则表达式看起来像这样:

&lt;td align=right&gt;(\d+?)&lt;/td&gt;

但是,当您从 XML/HTML 结构中获取数据时,最好使用解析器:

$dd = new DOMDocument();                                                                                                                                                                                   
$dd->loadHTML($response);                                                                                                                                                                                      
$tds = $dd->getElementsByTagName('td');                                                                                                                                                                    

foreach($tds as $td) {                                                                                                                                                                                     
    if(is_numeric($td->nodeValue))                                                                                                                                                                         
        echo $td->nodeValue.'<br />';                                                                                                                                                                      
} 

【讨论】:

  • 我确实尝试了您建议的正则表达式,但它返回了我在下面显示的内容(我只复制了几行)。我想只捕获这些行中的每一行的数字。我也尝试过与 dom 打交道,但在那里也有很多东西要学。 1 1 1 99 0 0 0 0
  • Array ( [0] =&gt; Array ( [0] =&gt; &lt;td align=right&gt;1&lt;/td&gt; [1] =&gt; &lt;td align=right&gt;1&lt;/td&gt; ) [1] =&gt; Array ( [0] =&gt; 1 [1] =&gt; 1 ) ) 这就是preg_match_all 将返回的内容,因此实际捕获的数字将在$matches[0]
  • 好的,下面是我把它放在我的 php.ini 文件中的方法。我做错什么了?什么都没有打印。 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, '192.168.1.40/dtm.html?address=N7:0'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($ch); preg_match_all('/(\d+?)/', $response, $matches2); print_r($matches2[0]);
  • 您需要转义正则表达式中的/&lt;\/td&gt; 或将周围的/ 更改为另一个字符,例如#)。将http:// 放在您的网址前。检查$response 是否确实包含您所期望的内容。执行var_dump($matches2); 并查看输出。然后再试print_r($matches2[0]);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多