我正在使用Laravel 5与Goutte进行爬行,我试图提取我需要的链接,而不是所有链接。基本的正则表达式出现了。Regex是好的,在线测试,它的工作,但当我试图应用该Regex在控制器我得到一个错误。下面是我的尝试:
<?php
namespace App'Http'Controllers;
use Illuminate'Http'Request;
use App'Http'Requests;
use App'Http'Controllers'Controller;
use Goutte'Client;
class RvnController extends Controller
{
public function index()
{
$client = new Client();
$crawler = $client->request('GET', 'http://www.jgpnis.rs/index.php/red-voznje-preuzimanje-pregled.html');
$regex_rvn_links = "/http:'/'/www.jgpnis.rs'/red_voznje'/([a-zA-Z0-9'-])+'/([a-zA-Z0-9'-'.])+/";
$links_array = array();
$crawler->filter('a')->each(function ($node) use($links_array) {
if (preg_match($regex_rvn_links , $node->link()->getUri())) {
$links_array[] = $node->link()->getUri();
}
});
dd($links_array);
}
}
错误如下:ErrorException in RvnController.php line 27: Undefined variable: regex_rvn_links
.
好吧,我试图通过这个错误应用正则表达式直接在preg_match
和它的工作,但我的$links_array
是空的。不要混淆,如果我打印$node->link()->getUri()
而不是将其推入数组,我得到大约15个链接,所以它是工作的。但是,我不能这样使用它,我需要那个数组。我的问题是在这种情况下如何使用变量,因为它们都不起作用。我错过了什么?
你正在使用闭包,需要正确地将变量传递给闭包。
1) $regex_rvn_links
必须传递到闭包中。这就是异常的原因。
2) $links_array
必须通过引用(&$links_array
)传递。这就是你得到空数组的原因。
$crawler->filter('a')->each(function ($node) use (&$links_array, $regex_rvn_links) {
if (preg_match($regex_rvn_links , $node->link()->getUri())) {
$links_array[] = $node->link()->getUri();
}
});