简体   繁体   English

在Laravel 5.4中的函数内部调用一个函数

[英]Calling one function inside function in laravel 5.4

My previous question was this parse the html data to array data in php 我之前的问题是将html数据解析为php中的数组数据

With reference to this Answer , i was trying the same thing to implemented in laravel .Its giving me error like DOMXPath::query(): Unable to call handler hasClasses() Then i was using something like below 参考这个答案 ,我正在尝试在laravel中实现相同的东西。它给了我类似DOMXPath::query(): Unable to call handler hasClasses()错误DOMXPath::query(): Unable to call handler hasClasses()然后我正在使用类似下面的东西

My laravel code : 我的laravel代码:

function hasClasses($attrValue, $requiredClasses)
{
    $requiredClasses = explode(' ', $requiredClasses);
    $classes = preg_split('~\s+~', $attrValue, -1, PREG_SPLIT_NO_EMPTY);

    return array_diff($requiredClasses, $classes) ? false : true;
}


function getScrapedata($keyword = 'laravel')
{
    $client = new Client();
    $client->setHeader('user-agent', "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3");
    $crawler = $client->request('GET', 'http://duckduckgo.com/?q=' . $keyword);
    $string = $crawler->filter('div#links.results')->html();

    $dom = new \DOMDocument;
    $state = libxml_use_internal_errors(true);
    $dom->loadHTML($string);
    libxml_use_internal_errors($state);

    $xp = new \DOMXPath($dom);
    $xp->registerNamespace('php', 'http://php.net/xpath');
    $xp->registerPhpFunctions('hasClasses');

    $mainDivClasses = 'result results_links results_links_deep web-result';
    $childDivClasses = 'links_main links_deep result__body';

    $divNodeList = $xp->query('//div[php:functionString("' . $this->hasClasses('class', $mainDivClasses) . '")]
                               /div[php:functionString("' . $this->hasClasses('class', $mainDivClasses) . '")]');

    $array_data = [];
    foreach ($divNodeList as $divNode) {
        $array_data[] = [
            trim($xp->evaluate('string(./h2/a[@class="result__a"])', $divNode)),
            trim($xp->evaluate('string(.//a[@class="result__snippet"])', $divNode)),
            trim($xp->evaluate('string(.//a[@class="result__url"])', $divNode)),
        ];
    }

    dd($array_data);
}

so then it started giving me another error this DOMXPath::query(): Unable to call handler () 所以它开始给我这个DOMXPath::query(): Unable to call handler ()另一个错误DOMXPath::query(): Unable to call handler ()

so actual error is here : 所以实际的错误在这里:

$divNodeList = $xp->query('//div[php:functionString("'.$this->hasClasses('class',$mainDivClasses).'")]
                               /div[php:functionString("'.$this->hasClasses('class',$mainDivClasses).'")]');

Can somebody please help me out with this . 有人可以帮我这个忙吗? How to call the function exactly .? 如何准确地调用该函数。

One way you could get around this is to change your hasClasses method to be: 解决这个hasClasses一种方法是将hasClasses方法更改为:

static function hasClasses($attrValue, $requiredClasses)

Then you should be able to do: 然后,您应该可以执行以下操作:

$divNodeList = $xp->query('//div[php:functionString("' . static::class . '::hasClasses", @class, "' . $mainDivClasses . '")]
                   /div[php:functionString("' . static::class . '::hasClasses", @class, "' . $childDivClasses . '")]');

Hope this helps! 希望这可以帮助!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM