Compare commits
15 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
894fb4344e | ||
|
e4fc716acd | ||
|
39dc0ca9c6 | ||
|
ef0a2efd4f | ||
|
5953daac54 | ||
|
465c6aefc7 | ||
|
92cb319d44 | ||
|
cbf3e0fcad | ||
|
cfa2d94a79 | ||
|
47a444bf9e | ||
|
85903fa9b5 | ||
|
e527c637c7 | ||
|
f0a9798925 | ||
|
faea883c6f | ||
|
c16826a573 |
12
.github/FUNDING.yml
vendored
Normal file
12
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# These are supported funding model platforms
|
||||||
|
|
||||||
|
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||||
|
patreon: # Replace with a single Patreon username
|
||||||
|
open_collective: querylist # Replace with a single Open Collective username
|
||||||
|
ko_fi: # Replace with a single Ko-fi username
|
||||||
|
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||||
|
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||||
|
liberapay: # Replace with a single Liberapay username
|
||||||
|
issuehunt: # Replace with a single IssueHunt username
|
||||||
|
otechie: # Replace with a single Otechie username
|
||||||
|
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -2,3 +2,4 @@
|
|||||||
.idea/
|
.idea/
|
||||||
composer.lock
|
composer.lock
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
*.cache
|
@ -29,7 +29,7 @@
|
|||||||
- .....
|
- .....
|
||||||
|
|
||||||
## 环境要求
|
## 环境要求
|
||||||
- PHP >= 7.0
|
- PHP >= 7.1
|
||||||
|
|
||||||
> 如果你的PHP版本还停留在PHP5,或者不会使用Composer,你可以选择使用QueryList3,QueryList3支持php5.3以及手动安装。
|
> 如果你的PHP版本还停留在PHP5,或者不会使用Composer,你可以选择使用QueryList3,QueryList3支持php5.3以及手动安装。
|
||||||
QueryList3 文档:http://v3.querylist.cc
|
QueryList3 文档:http://v3.querylist.cc
|
||||||
|
@ -31,7 +31,7 @@ Through plug-ins you can easily implement things like:
|
|||||||
- .....
|
- .....
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
- PHP >= 7.0
|
- PHP >= 7.1
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
By Composer installation:
|
By Composer installation:
|
||||||
|
@ -4,11 +4,11 @@
|
|||||||
"keywords":["QueryList","phpQuery","spider"],
|
"keywords":["QueryList","phpQuery","spider"],
|
||||||
"homepage": "http://querylist.cc",
|
"homepage": "http://querylist.cc",
|
||||||
"require": {
|
"require": {
|
||||||
"PHP":">=7.0",
|
"PHP":">=7.1",
|
||||||
"jaeger/phpquery-single": "^1",
|
"jaeger/phpquery-single": "^1",
|
||||||
"tightenco/collect": "^5",
|
|
||||||
"jaeger/g-http": "^1.1",
|
"jaeger/g-http": "^1.1",
|
||||||
"ext-dom": "*"
|
"ext-dom": "*",
|
||||||
|
"tightenco/collect": ">5.0"
|
||||||
},
|
},
|
||||||
"suggest":{
|
"suggest":{
|
||||||
|
|
||||||
@ -32,6 +32,9 @@
|
|||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"symfony/var-dumper": "^3.3",
|
"symfony/var-dumper": "^3.3",
|
||||||
"phpunit/phpunit": "^7.5"
|
"phpunit/phpunit": "^8.5"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "./vendor/bin/phpunit"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
namespace QL;
|
namespace QL;
|
||||||
use Closure;
|
use Closure;
|
||||||
|
use Tightenco\Collect\Support\Collection;
|
||||||
|
|
||||||
class Config
|
class Config
|
||||||
{
|
{
|
||||||
@ -20,8 +21,8 @@ class Config
|
|||||||
*/
|
*/
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->plugins = collect();
|
$this->plugins = new Collection();
|
||||||
$this->binds = collect();
|
$this->binds = new Collection();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ namespace QL\Dom;
|
|||||||
|
|
||||||
use phpDocumentor\Reflection\Types\Null_;
|
use phpDocumentor\Reflection\Types\Null_;
|
||||||
use phpQueryObject;
|
use phpQueryObject;
|
||||||
|
use Tightenco\Collect\Support\Collection;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Elements
|
* Class Elements
|
||||||
@ -191,7 +192,7 @@ class Elements
|
|||||||
*/
|
*/
|
||||||
public function map($callback)
|
public function map($callback)
|
||||||
{
|
{
|
||||||
$collection = collect();
|
$collection = new Collection();
|
||||||
$this->elements->each(function ($dom) use (& $collection, $callback) {
|
$this->elements->each(function ($dom) use (& $collection, $callback) {
|
||||||
$collection->push($callback(new self(pq($dom))));
|
$collection->push($callback(new self(pq($dom))));
|
||||||
});
|
});
|
||||||
|
@ -64,7 +64,7 @@ class Query
|
|||||||
*/
|
*/
|
||||||
public function getData(Closure $callback = null)
|
public function getData(Closure $callback = null)
|
||||||
{
|
{
|
||||||
return is_null($callback) ? $this->data : $this->data->map($callback);
|
return $this->handleData($this->data, $callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -125,8 +125,8 @@ class Query
|
|||||||
*/
|
*/
|
||||||
public function removeHead()
|
public function removeHead()
|
||||||
{
|
{
|
||||||
$html = preg_replace('/<head.+?>.+<\/head>/is','<head></head>',$this->html);
|
$html = preg_replace('/(<head>|<head\s+.+?>).+?<\/head>/is', '<head></head>', $this->html);
|
||||||
$this->setHtml($html);
|
$html && $this->setHtml($html);
|
||||||
return $this->ql;
|
return $this->ql;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -139,10 +139,23 @@ class Query
|
|||||||
public function query(Closure $callback = null)
|
public function query(Closure $callback = null)
|
||||||
{
|
{
|
||||||
$this->data = $this->getList();
|
$this->data = $this->getList();
|
||||||
$callback && $this->data = $this->data->map($callback);
|
$this->data = $this->handleData($this->data, $callback);
|
||||||
return $this->ql;
|
return $this->ql;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function handleData(Collection $data, $callback)
|
||||||
|
{
|
||||||
|
if (is_callable($callback)) {
|
||||||
|
if (empty($this->range)) {
|
||||||
|
$data = new Collection($callback($data->all(), null));
|
||||||
|
} else {
|
||||||
|
$data = $data->map($callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
protected function getList()
|
protected function getList()
|
||||||
{
|
{
|
||||||
$data = [];
|
$data = [];
|
||||||
@ -165,7 +178,7 @@ class Query
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return collect($data);
|
return new Collection($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function extractContent(phpQueryObject $pqObj, $ruleName, $rule)
|
protected function extractContent(phpQueryObject $pqObj, $ruleName, $rule)
|
||||||
@ -196,7 +209,13 @@ class Query
|
|||||||
})->all();
|
})->all();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
if(preg_match('/attr\((.+)\)/', $rule['attr'], $arr)) {
|
||||||
|
$content = $pqObj->attr($arr[1]);
|
||||||
|
} elseif (preg_match('/attrs\((.+)\)/', $rule['attr'], $arr)) {
|
||||||
|
$content = (new Elements($pqObj))->attrs($arr[1])->all();
|
||||||
|
} else {
|
||||||
$content = $pqObj->attr($rule['attr']);
|
$content = $pqObj->attr($rule['attr']);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -257,10 +276,8 @@ class Query
|
|||||||
{
|
{
|
||||||
$tagArr = preg_split("/\s+/", $tags_str, -1, PREG_SPLIT_NO_EMPTY);
|
$tagArr = preg_split("/\s+/", $tags_str, -1, PREG_SPLIT_NO_EMPTY);
|
||||||
$tags = array(array(), array());
|
$tags = array(array(), array());
|
||||||
foreach($tagArr as $tag)
|
foreach ($tagArr as $tag) {
|
||||||
{
|
if (preg_match('/-(.+)/', $tag, $arr)) {
|
||||||
if(preg_match('/-(.+)/', $tag,$arr))
|
|
||||||
{
|
|
||||||
array_push($tags[1], $arr[1]);
|
array_push($tags[1], $arr[1]);
|
||||||
} else {
|
} else {
|
||||||
array_push($tags[0], $tag);
|
array_push($tags[0], $tag);
|
||||||
@ -278,8 +295,7 @@ class Query
|
|||||||
protected function removeTags($html, $tags)
|
protected function removeTags($html, $tags)
|
||||||
{
|
{
|
||||||
$tag_str = '';
|
$tag_str = '';
|
||||||
if(count($tags))
|
if (count($tags)) {
|
||||||
{
|
|
||||||
foreach ($tags as $tag) {
|
foreach ($tags as $tag) {
|
||||||
$tag_str .= $tag_str ? ',' . $tag : $tag;
|
$tag_str .= $tag_str ? ',' . $tag : $tag;
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@ use Closure;
|
|||||||
use QL\Providers\HttpServiceProvider;
|
use QL\Providers\HttpServiceProvider;
|
||||||
use QL\Providers\PluginServiceProvider;
|
use QL\Providers\PluginServiceProvider;
|
||||||
use QL\Providers\SystemServiceProvider;
|
use QL\Providers\SystemServiceProvider;
|
||||||
|
use Tightenco\Collect\Support\Collection;
|
||||||
|
|
||||||
class Kernel
|
class Kernel
|
||||||
{
|
{
|
||||||
@ -34,7 +35,7 @@ class Kernel
|
|||||||
public function __construct(QueryList $ql)
|
public function __construct(QueryList $ql)
|
||||||
{
|
{
|
||||||
$this->ql = $ql;
|
$this->ql = $ql;
|
||||||
$this->binds = collect();
|
$this->binds = new Collection();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function bootstrap()
|
public function bootstrap()
|
||||||
|
@ -23,7 +23,7 @@ use QL\Services\MultiRequestService;
|
|||||||
* Class QueryList
|
* Class QueryList
|
||||||
* @package QL
|
* @package QL
|
||||||
*
|
*
|
||||||
* @method string getHtml()
|
* @method string getHtml($rel = true)
|
||||||
* @method QueryList setHtml($html)
|
* @method QueryList setHtml($html)
|
||||||
* @method QueryList html($html)
|
* @method QueryList html($html)
|
||||||
* @method Dom\Elements find($selector)
|
* @method Dom\Elements find($selector)
|
||||||
|
@ -17,7 +17,7 @@ class FindTest extends TestCaseBase
|
|||||||
protected $html;
|
protected $html;
|
||||||
protected $ql;
|
protected $ql;
|
||||||
|
|
||||||
public function setUp()
|
protected function setUp(): void
|
||||||
{
|
{
|
||||||
$this->html = $this->getSnippet('snippet-1');
|
$this->html = $this->getSnippet('snippet-1');
|
||||||
$this->ql = QueryList::html($this->html);
|
$this->ql = QueryList::html($this->html);
|
||||||
|
@ -18,7 +18,7 @@ class RulesTest extends TestCaseBase
|
|||||||
protected $html;
|
protected $html;
|
||||||
protected $ql;
|
protected $ql;
|
||||||
|
|
||||||
public function setUp()
|
protected function setUp(): void
|
||||||
{
|
{
|
||||||
$this->html = $this->getSnippet('snippet-2');
|
$this->html = $this->getSnippet('snippet-2');
|
||||||
$this->ql = QueryList::html($this->html);
|
$this->ql = QueryList::html($this->html);
|
||||||
|
@ -18,7 +18,7 @@ class HttpTest extends TestCaseBase
|
|||||||
{
|
{
|
||||||
protected $urls;
|
protected $urls;
|
||||||
|
|
||||||
public function setUp()
|
protected function setUp(): void
|
||||||
{
|
{
|
||||||
$this->urls = [
|
$this->urls = [
|
||||||
'http://httpbin.org/get?name=php',
|
'http://httpbin.org/get?name=php',
|
||||||
|
@ -16,7 +16,7 @@ class InstanceTest extends TestCaseBase
|
|||||||
{
|
{
|
||||||
protected $html;
|
protected $html;
|
||||||
|
|
||||||
public function setUp()
|
protected function setUp(): void
|
||||||
{
|
{
|
||||||
$this->html = $this->getSnippet('snippet-1');
|
$this->html = $this->getSnippet('snippet-1');
|
||||||
}
|
}
|
||||||
@ -38,11 +38,11 @@ class InstanceTest extends TestCaseBase
|
|||||||
public function get_new_object()
|
public function get_new_object()
|
||||||
{
|
{
|
||||||
$ql = (new QueryList())->html($this->html);
|
$ql = (new QueryList())->html($this->html);
|
||||||
$ql2 = new QueryList();
|
$ql2 = (new QueryList())->html('');
|
||||||
$this->assertNotEquals($ql->getHtml(),$ql2->getHtml());
|
$this->assertNotEquals($ql->getHtml(),$ql2->getHtml());
|
||||||
|
|
||||||
$ql = QueryList::range('')->html($this->html);
|
$ql = QueryList::range('')->html($this->html);
|
||||||
$ql2 = QueryList::range('');
|
$ql2 = QueryList::range('')->html('');
|
||||||
$this->assertNotEquals($ql->getHtml(),$ql2->getHtml());
|
$this->assertNotEquals($ql->getHtml(),$ql2->getHtml());
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -16,7 +16,7 @@ class MethodTest extends TestCaseBase
|
|||||||
{
|
{
|
||||||
protected $html;
|
protected $html;
|
||||||
|
|
||||||
public function setUp()
|
protected function setUp(): void
|
||||||
{
|
{
|
||||||
$this->html = $this->getSnippet('snippet-1');
|
$this->html = $this->getSnippet('snippet-1');
|
||||||
}
|
}
|
||||||
@ -30,7 +30,7 @@ class MethodTest extends TestCaseBase
|
|||||||
$qlHtml = QueryList::pipe(function(QueryList $ql) use($html){
|
$qlHtml = QueryList::pipe(function(QueryList $ql) use($html){
|
||||||
$ql->setHtml($html);
|
$ql->setHtml($html);
|
||||||
return $ql;
|
return $ql;
|
||||||
})->getHtml();
|
})->getHtml(false);
|
||||||
$this->assertEquals($html,$qlHtml);
|
$this->assertEquals($html,$qlHtml);
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user