我想从第三方页面收集一些数据。我为此使用了http://simplehtmldom.sourceforge.net/。在构造中,我从页面中获取选择项目,然后将其传递给loopSelect($html)
,后者循环选项(某些产品类别),然后在新参数(产品类别)中对其进行POST调用。页。服务器返回一个字符串(子类别的选择框)。
问题:
行var_dump($select);
返回空字符串。如果我删除行$type = $this->getBetween...
它按预期工作,我可以看到每个产品类别的每个子类别的选择字符串。
/**
*
* @param array $search
* @return string
*/
function getSelect(array $search = [])
{
$default = [
'option' => 'com_batteryfinder',
'format' => 'raw',
'controller' => 'batteryfinder',
'task' => 'getdropdown',
];
$data = array_merge($default, $search);
var_dump($data);
// use key 'http' even if you send the request to https://...
$options = array(
'http' => array(
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data),
),
);
$context = stream_context_create($options);
return file_get_contents($this->url, false, $context);
}
function loopSelect($html)
{
$name = $html->find('select',0)->getAttribute ( 'name' );
foreach($html->find('option') as $option)
{
if ($option->value)
{
$this->formData[$name] = $option->value;
$select = $this->getSelect($this->formData);
var_dump($select);
$type = $this->getBetween($select, "loadSearchSelect(options, '", "');");
}
}
}
看起来调用方法getBetween
会弄乱一切。
function getBetween($out, $start, $end)
{
if (strpos($out, $start) === false)
{
return FALSE;
}
$startsAt = strpos($out, $start) + strlen($start);
$endsAt = strpos($out, $end, $startsAt);
if ($endsAt=== FALSE)
{
return FALSE;
}
return substr($out, $startsAt, $endsAt - $startsAt);
}
将$select
传递给新变量似乎可以解决问题,但我不知道为什么会这样做?
$this->formData[$name] = $option->value;
$select = $this->getSelect($this->formData);
var_dump($select);
$out = $select;
$type = $this->getBetween($out, "loadSearchSelect(options, '", "');");
var_dump($type);
答案 0 :(得分:0)
很抱歉,如果我过于明显,但是,您是否有显示错误处于活动状态?可能getBetween导致一些未显示的错误并完成脚本的执行?或者var_dump显示'字符串(0)""'或者像,并且脚本完成了。
无论如何,为什么你不使用正则表达式来实现getBetween函数?