我想回复来自其他网站的一些数据,类似于此问题Getting data from another site with php via ID。
表格中有一行我想得到并回声,但不能让它回应任何东西。
这是我的代码,因为我将其改编为上述问题的代码,但它不起作用。
$content = "http://voucher.gov.gr/project/pedy-results/gid/14?search=PDNO-78256-114-20140722-120951";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $content);
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$body= curl_exec ($ch);
curl_close ($ch);
preg_match('#<tr class="row0"><td>([0-9\.]*)</td><td>([0-9\.]*)</td><td>([0-9\.]*)</td><td>([0-9\.]*)</td><td>([0-9\.]*)</td><td>([0-9\.]*)</td><td>([0-9\.]*)</td><td>([0-9\.]*)</td><td>([0-9\.]*)</td><td>([0-9\.]*)</td><td>([0-9\.]*)</td>#Uis', $body, $resultmatch);
$results = $resultmatch;
foreach($results as $word)
echo $word;
但是创建了数组但没有数据。任何帮助/建议将不胜感激!
EDIT 解决方案:谢谢大家的帮助,但我成功了!这是代码:
preg_match('#<td>(.*)</td>(.*)<td>(.*)</td>(.*)<td style="max-width:151px;"><strong>(.*)</strong></td>(.*)<td>(.*)</td>(.*)<td>(.*)</td>(.*)<td>(.*)</td>(.*)<td>(.*)</td>(.*)<td>(.*)</td>(.*)<td>(.*)</td>(.*)<td>(.*)</td>#Uis', $body, $resultmatch);
这段代码不是绝对正确的答案,因为它不仅会返回我想要的td内的信息,还会返回它们之间的空白区域,因为代码无法正常工作没有放&#34;(。*)&#34;在td之间。
(...</td>(.*)<td>..)
所以我不得不忍受它!但是你可以通过忽略在数组中插入带有空格的结果的位置来避免它,在我们的例子中是resultmatch[2,4,6,8,10...]
,依此类推。我希望我的编辑有所帮助。当然可以进一步改进代码,以避免将空格插入数组中。
答案 0 :(得分:0)
确定卷曲正确返回页面正文后,您的问题就在于preg_match
。
匹配正在查找包含11个表格单元格的css类“row0”的行,每个表单元格的内容都以数字开头,后跟任何([0-9\.]*)
。
所寻址的页面在前5个单元格中的内容在开头是非数字的,因此没有匹配,因此要匹配此行,您可以将表达式更改为:
'#<tr class="row0"><td>(.*)</td><td>(.*)</td><td>(.*)</td><td>(.*)</td><td>(.*)</td><td>([0-9\.]*)</td><td>([0-9\.]*)</td><td>([0-9\.]*)</td><td>([0-9\.]*)</td><td>([0-9\.]*)</td><td>([0-9\.]*)</td>#Uis'
正如我在评论中所说,正则表达式不是我强大的技能之一(因此我在评论中略有错误),所以虽然我认为这会有效,但您可能需要调整它。
我发现RegExp“小提琴”网站http://regex101.com/非常有用。
答案 1 :(得分:0)
如果检查$ body,会有很多不必要的空格和换行符,导致表达式无法找到匹配项。
为了匹配字母数字字符串,您需要类似'(。*?)\ u'
的字符串注意结束前的u,它允许匹配unicode字符。
所以我认为这就是你所需要的:
$content = "http://voucher.gov.gr/project/pedy-results/gid/14?search=PDNO-78256-114-20140722-120951";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $content);
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$body= curl_exec ($ch);
curl_close ($ch);
//you need to strip whitespace and line breaks first
$body = preg_replace('~>[\s|\r\n]+<~', '><', $body);
$body = preg_replace('#\n( *?)#', '', $body);
preg_match('#<tr class=\"row0\"><td>(.*?)</td><td>(.*?)</td><td(.*?)>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td>#u', $body, $resultmatch);
var_dump($resultmatch);
以上结果如下:
array (size=13)
0 => string '<...>' (length=398)
1 => string 'Στερεάς Ελλάδας' (length=29)
2 => string 'Φθιώτιδας' (length=18)
3 => string ' style="max-width:151px;"' (length=25)
4 => string '<strong>PDNO-78256-114-20140722-120951</strong>' (length=47)
5 => string '
22/07/2014 12:09:51 ' (length=99)
6 => string 'Επιλεχθείς' (length=20)
7 => string '30' (length=2)
8 => string '30' (length=2)
9 => string '30' (length=2)
10 => string '10' (length=2)
11 => string '100' (length=3)
12 => string '1 ' (length=33)
答案 2 :(得分:0)
我相信你不应该使用正则表达式来解析HTML元素。
使用DOM API会减少错误。
您可以将“preg_match”行替换为:
libxml_use_internal_errors(true);
$domDocument = new DOMDocument();
$domDocument->loadHTML($body);
$xpath = new DOMXPath($domDocument);
$nodes = $xpath->query('//tr[@class="row0"][1]/td');
$results = array();
foreach($nodes as $node) {
$value = trim($node->nodeValue);
if( ctype_digit($value) ) {
$results[] = $node->nodeValue;
}
}