diff --git a/composer.json b/composer.json index 7a418a5..c3c30c0 100644 --- a/composer.json +++ b/composer.json @@ -32,6 +32,9 @@ }, "require-dev": { "symfony/var-dumper": "^3.3", - "phpunit/phpunit": "^7.5" + "phpunit/phpunit": "^8.5" + }, + "scripts": { + "test": "./vendor/bin/phpunit" } } diff --git a/src/Dom/Query.php b/src/Dom/Query.php index 40026a0..16635ad 100644 --- a/src/Dom/Query.php +++ b/src/Dom/Query.php @@ -52,7 +52,7 @@ class Query { $this->html = value($html); $this->destroyDocument(); - $this->document = phpQuery::newDocumentHTML($this->html,$charset); + $this->document = phpQuery::newDocumentHTML($this->html, $charset); return $this->ql; } @@ -64,7 +64,7 @@ class Query */ public function getData(Closure $callback = null) { - return is_null($callback) ? $this->data : $this->data->map($callback); + return $this->handleData($this->data, $callback); } /** @@ -125,7 +125,7 @@ class Query */ public function removeHead() { - $html = preg_replace('/<head.+?>.+<\/head>/is','<head></head>',$this->html); + $html = preg_replace('/<head.+?>.+<\/head>/is', '<head></head>', $this->html); $this->setHtml($html); return $this->ql; } @@ -139,24 +139,37 @@ class Query public function query(Closure $callback = null) { $this->data = $this->getList(); - $callback && $this->data = $this->data->map($callback); + $this->data = $this->handleData($this->data, $callback); return $this->ql; } + public function handleData(Collection $data, $callback) + { + if (is_callable($callback)) { + if (empty($this->range)) { + $data = collect($callback($data->all(), null)); + } else { + $data = $data->map($callback); + } + } + + return $data; + } + protected function getList() { $data = []; if (empty($this->range)) { - foreach ($this->rules as $key => $reg_value){ + foreach ($this->rules as $key => $reg_value) { $rule = $this->parseRule($reg_value); $contentElements = $this->document->find($rule['selector']); $data[$key] = $this->extractContent($contentElements, $key, $rule); } } else { - $rangeElements = $this->document->find($this->range); + $rangeElements = $this->document->find($this->range); $i = 0; foreach ($rangeElements as $element) { - foreach ($this->rules as $key => $reg_value){ + foreach ($this->rules as $key => $reg_value) { $rule = $this->parseRule($reg_value); $contentElements = pq($element)->find($rule['selector']); $data[$i][$key] = $this->extractContent($contentElements, $key, $rule); @@ -175,7 +188,7 @@ class Query $content = $this->allowTags($pqObj->html(), $rule['filter_tags']); break; case 'texts': - $content = (new Elements($pqObj))->map(function(Elements $element) use($rule){ + $content = (new Elements($pqObj))->map(function (Elements $element) use ($rule) { return $this->allowTags($element->html(), $rule['filter_tags']); })->all(); break; @@ -183,7 +196,7 @@ class Query $content = $this->stripTags($pqObj->html(), $rule['filter_tags']); break; case 'htmls': - $content = (new Elements($pqObj))->map(function(Elements $element) use($rule){ + $content = (new Elements($pqObj))->map(function (Elements $element) use ($rule) { return $this->stripTags($element->html(), $rule['filter_tags']); })->all(); break; @@ -191,7 +204,7 @@ class Query $content = $this->stripTags($pqObj->htmlOuter(), $rule['filter_tags']); break; case 'htmlOuters': - $content = (new Elements($pqObj))->map(function(Elements $element) use($rule){ + $content = (new Elements($pqObj))->map(function (Elements $element) use ($rule) { return $this->stripTags($element->htmlOuter(), $rule['filter_tags']); })->all(); break; @@ -200,7 +213,7 @@ class Query break; } - if(is_callable($rule['handle_callback'])){ + if (is_callable($rule['handle_callback'])) { $content = call_user_func($rule['handle_callback'], $content, $ruleName); } @@ -220,49 +233,47 @@ class Query /** * 去除特定的html标签 - * @param string $html - * @param string $tags_str 多个标签名之间用空格隔开 + * @param string $html + * @param string $tags_str 多个标签名之间用空格隔开 * @return string */ - protected function stripTags($html,$tags_str) + protected function stripTags($html, $tags_str) { $tagsArr = $this->tag($tags_str); - $html = $this->removeTags($html,$tagsArr[1]); + $html = $this->removeTags($html, $tagsArr[1]); $p = array(); foreach ($tagsArr[0] as $tag) { - $p[]="/(<(?:\/".$tag."|".$tag.")[^>]*>)/i"; + $p[] = "/(<(?:\/" . $tag . "|" . $tag . ")[^>]*>)/i"; } - $html = preg_replace($p,"",trim($html)); + $html = preg_replace($p, "", trim($html)); return $html; } /** * 保留特定的html标签 - * @param string $html - * @param string $tags_str 多个标签名之间用空格隔开 + * @param string $html + * @param string $tags_str 多个标签名之间用空格隔开 * @return string */ - protected function allowTags($html,$tags_str) + protected function allowTags($html, $tags_str) { $tagsArr = $this->tag($tags_str); - $html = $this->removeTags($html,$tagsArr[1]); + $html = $this->removeTags($html, $tagsArr[1]); $allow = ''; foreach ($tagsArr[0] as $tag) { $allow .= "<$tag> "; } - return strip_tags(trim($html),$allow); + return strip_tags(trim($html), $allow); } protected function tag($tags_str) { - $tagArr = preg_split("/\s+/",$tags_str,-1,PREG_SPLIT_NO_EMPTY); - $tags = array(array(),array()); - foreach($tagArr as $tag) - { - if(preg_match('/-(.+)/', $tag,$arr)) - { + $tagArr = preg_split("/\s+/", $tags_str, -1, PREG_SPLIT_NO_EMPTY); + $tags = array(array(), array()); + foreach ($tagArr as $tag) { + if (preg_match('/-(.+)/', $tag, $arr)) { array_push($tags[1], $arr[1]); - }else{ + } else { array_push($tags[0], $tag); } } @@ -271,17 +282,16 @@ class Query /** * 移除特定的html标签 - * @param string $html - * @param array $tags 标签数组 + * @param string $html + * @param array $tags 标签数组 * @return string */ - protected function removeTags($html,$tags) + protected function removeTags($html, $tags) { $tag_str = ''; - if(count($tags)) - { + if (count($tags)) { foreach ($tags as $tag) { - $tag_str .= $tag_str?','.$tag:$tag; + $tag_str .= $tag_str ? ',' . $tag : $tag; } // phpQuery::$defaultCharset = $this->inputEncoding?$this->inputEncoding:$this->htmlEncoding; $doc = phpQuery::newDocumentHTML($html); @@ -294,7 +304,7 @@ class Query protected function destroyDocument() { - if($this->document instanceof phpQueryObject) { + if ($this->document instanceof phpQueryObject) { $this->document->unloadDocument(); } } diff --git a/tests/Dom/FindTest.php b/tests/Dom/FindTest.php index acf5c84..024df21 100644 --- a/tests/Dom/FindTest.php +++ b/tests/Dom/FindTest.php @@ -17,7 +17,7 @@ class FindTest extends TestCaseBase protected $html; protected $ql; - public function setUp() + protected function setUp(): void { $this->html = $this->getSnippet('snippet-1'); $this->ql = QueryList::html($this->html); diff --git a/tests/Dom/RulesTest.php b/tests/Dom/RulesTest.php index d2d70a7..7c555ca 100644 --- a/tests/Dom/RulesTest.php +++ b/tests/Dom/RulesTest.php @@ -18,7 +18,7 @@ class RulesTest extends TestCaseBase protected $html; protected $ql; - public function setUp() + protected function setUp(): void { $this->html = $this->getSnippet('snippet-2'); $this->ql = QueryList::html($this->html); diff --git a/tests/Feature/HttpTest.php b/tests/Feature/HttpTest.php index cba79e3..0d723ed 100644 --- a/tests/Feature/HttpTest.php +++ b/tests/Feature/HttpTest.php @@ -18,7 +18,7 @@ class HttpTest extends TestCaseBase { protected $urls; - public function setUp() + protected function setUp(): void { $this->urls = [ 'http://httpbin.org/get?name=php', diff --git a/tests/Feature/InstanceTest.php b/tests/Feature/InstanceTest.php index 58c268d..a659060 100644 --- a/tests/Feature/InstanceTest.php +++ b/tests/Feature/InstanceTest.php @@ -16,7 +16,7 @@ class InstanceTest extends TestCaseBase { protected $html; - public function setUp() + protected function setUp(): void { $this->html = $this->getSnippet('snippet-1'); } @@ -38,11 +38,11 @@ class InstanceTest extends TestCaseBase public function get_new_object() { $ql = (new QueryList())->html($this->html); - $ql2 = new QueryList(); + $ql2 = (new QueryList())->html(''); $this->assertNotEquals($ql->getHtml(),$ql2->getHtml()); $ql = QueryList::range('')->html($this->html); - $ql2 = QueryList::range(''); + $ql2 = QueryList::range('')->html(''); $this->assertNotEquals($ql->getHtml(),$ql2->getHtml()); } } \ No newline at end of file diff --git a/tests/Feature/MethodTest.php b/tests/Feature/MethodTest.php index 684cbd0..ca10cf9 100644 --- a/tests/Feature/MethodTest.php +++ b/tests/Feature/MethodTest.php @@ -16,7 +16,7 @@ class MethodTest extends TestCaseBase { protected $html; - public function setUp() + protected function setUp(): void { $this->html = $this->getSnippet('snippet-1'); } @@ -30,7 +30,7 @@ class MethodTest extends TestCaseBase $qlHtml = QueryList::pipe(function(QueryList $ql) use($html){ $ql->setHtml($html); return $ql; - })->getHtml(); + })->getHtml(false); $this->assertEquals($html,$qlHtml); } } \ No newline at end of file