diff --git a/src/Dom/Elements.php b/src/Dom/Elements.php index d093886..d778f96 100644 --- a/src/Dom/Elements.php +++ b/src/Dom/Elements.php @@ -9,8 +9,140 @@ namespace QL\Dom; use phpQueryObject; +/** + * Class Elements + * @package QL\Dom + * + * @method Elements toReference($var) + * @method documentFragment($state) + * @method Elements toRoot() + * @method Elements getDocumentIDRef($documentID) + * @method Elements getDocument() + * @method getDOMDocument() + * @method Elements getDocumentID() + * @method Elements unloadDocument() + * @method isHTML() + * @method isXHTML() + * @method isXML() + * @method serialize() + * @method serializeArray($submit) + * @method get($index,$callback1,$callback2,$callback3) + * @method getString($index,$callback1,$callback2,$callback3) + * @method getStrings($index,$callback1,$callback2,$callback3) + * @method newInstance($newStack) + * @method Elements find($selectors,$context,$noHistory) + * @method Elements is($selector,$nodes) + * @method Elements filterCallback($callback,$_skipHistory) + * @method Elements filter($selectors,$_skipHistory) + * @method load($url,$data,$callback) + * @method css() + * @method show() + * @method hide() + * @method Elements trigger($type,$data) + * @method Elements triggerHandler($type,$data) + * @method Elements bind($type,$data,$callback) + * @method unbind($type,$callback) + * @method Elements change($callback) + * @method Elements submit($callback) + * @method Elements click($callback) + * @method Elements wrapAllOld($wrapper) + * @method Elements wrapAll($wrapper) + * @method Elements wrapAllPHP($codeBefore,$codeAfter) + * @method Elements wrap($wrapper) + * @method Elements wrapPHP($codeBefore,$codeAfter) + * @method Elements wrapInner($wrapper) + * @method Elements wrapInnerPHP($codeBefore,$codeAfter) + * @method Elements contents() + * @method Elements contentsUnwrap() + * @method switchWith($markup) + * @method Elements eq($num) + * @method Elements size() + * @method Elements length() + * @method count() + * @method Elements end($level) + * @method Elements _clone() + * @method Elements replaceWithPHP($code) + * @method Elements replaceWith($content) + * @method Elements replaceAll($selector) + * @method Elements remove($selector) + * @method markup($markup,$callback1,$callback2,$callback3) + * @method markupOuter($callback1,$callback2,$callback3) + * @method html($html,$callback1,$callback2,$callback3) + * @method xml($xml,$callback1,$callback2,$callback3) + * @method htmlOuter($callback1,$callback2,$callback3) + * @method xmlOuter($callback1,$callback2,$callback3) + * @method Elements php($code) + * @method markupPHP($code) + * @method markupOuterPHP() + * @method Elements children($selector) + * @method Elements ancestors($selector) + * @method Elements append($content) + * @method Elements appendPHP($content) + * @method Elements appendTo($seletor) + * @method Elements prepend($content) + * @method Elements prependPHP($content) + * @method Elements prependTo($seletor) + * @method Elements before($content) + * @method Elements beforePHP($content) + * @method Elements insertBefore($seletor) + * @method Elements after($content) + * @method Elements afterPHP($content) + * @method Elements insertAfter($seletor) + * @method Elements insert($target,$type) + * @method index($subject) + * @method Elements slice($start,$end) + * @method Elements reverse() + * @method text($text,$callback1,$callback2,$callback3) + * @method Elements plugin($class,$file) + * @method extend($class,$file) + * @method Elements _next($selector) + * @method Elements _prev($selector) + * @method Elements prev($selector) + * @method Elements prevAll($selector) + * @method Elements nextAll($selector) + * @method Elements siblings($selector) + * @method Elements not($selector) + * @method Elements add($selector) + * @method Elements parent($selector) + * @method Elements parents($selector) + * @method stack($nodeTypes) + * @method attr($attr,$value) + * @method Elements attrPHP($attr,$code) + * @method Elements removeAttr($attr) + * @method val($val) + * @method Elements andSelf() + * @method Elements addClass($className) + * @method Elements addClassPHP($className) + * @method hasClass($className) + * @method Elements removeClass($className) + * @method Elements toggleClass($className) + * @method Elements _empty() + * @method Elements each($callback,$param1,$param2,$param3) + * @method Elements callback($callback,$param1,$param2,$param3) + * @method data($key,$value) + * @method removeData($key) + * @method rewind() + * @method current() + * @method key() + * @method Elements next($cssSelector) + * @method valid() + * @method offsetExists($offset) + * @method offsetGet($offset) + * @method offsetSet($offset,$value) + * @method offsetUnset($offset) + * @method whois($oneNode) + * @method Elements dump() + * @method dumpWhois() + * @method dumpLength() + * @method dumpTree($html,$title) + * @method dumpDie() + */ + class Elements { + /** + * @var phpQueryObject + */ protected $elements; /** diff --git a/src/Dom/Query.php b/src/Dom/Query.php new file mode 100644 index 0000000..ad32c46 --- /dev/null +++ b/src/Dom/Query.php @@ -0,0 +1,206 @@ + + * Date: 2017/9/21 + */ + +namespace QL\Dom; + +use phpQuery; +use QL\QueryList; + +class Query +{ + protected $html; + protected $document; + protected $rules; + protected $range = null; + protected $ql; + + + public function __construct(QueryList $ql) + { + $this->ql = $ql; + } + + + /** + * @return mixed + */ + public function getHtml() + { + return $this->html; + } + + public function setHtml($html) + { + $this->html = $html; + $this->document = phpQuery::newDocumentHTML($this->html); + return $this->ql; + } + + public function find($selector) + { + return (new Dom($this->document))->find($selector); + } + + public function rules(array $rules) + { + $this->rules = $rules; + return $this->ql; + } + + + public function range($range) + { + $this->range = $range; + return $this->ql; + } + + public function removeHead() + { + $html = preg_replace('/.+<\/head>/is','',$this->html); + $this->setHtml($html); + return $this->ql; + } + + public function query($callback = null) + { + $data = $this->getList(); + return is_null($callback)?$data:$data->map($callback); + } + + protected function getList() + { + $data = []; + $document = $this->document; + if (!empty($this->range)) { + $robj = pq($document)->find($this->range); + $i = 0; + foreach ($robj as $item) { + foreach ($this->rules as $key => $reg_value){ + $tags = $reg_value[2] ?? ''; + $iobj = pq($item)->find($reg_value[0]); + switch ($reg_value[1]) { + case 'text': + $data[$i][$key] = $this->allowTags(pq($iobj)->html(),$tags); + break; + case 'html': + $data[$i][$key] = $this->stripTags(pq($iobj)->html(),$tags); + break; + default: + $data[$i][$key] = pq($iobj)->attr($reg_value[1]); + break; + } + + if(isset($reg_value[3])){ + $data[$i][$key] = call_user_func($reg_value[3],$data[$i][$key],$key); + } + } + $i++; + } + } else { + foreach ($this->rules as $key => $reg_value){ + $tags = $reg_value[2] ?? ''; + $lobj = pq($document)->find($reg_value[0]); + $i = 0; + foreach ($lobj as $item) { + switch ($reg_value[1]) { + case 'text': + $data[$i][$key] = $this->allowTags(pq($item)->html(),$tags); + break; + case 'html': + $data[$i][$key] = $this->stripTags(pq($item)->html(),$tags); + break; + default: + $data[$i][$key] = pq($item)->attr($reg_value[1]); + break; + } + + if(isset($reg_value[3])){ + $data[$i][$key] = call_user_func($reg_value[3],$data[$i][$key],$key); + } + + $i++; + } + } + } +// phpQuery::$documents = array(); + return collect($data); + } + + /** + * 去除特定的html标签 + * @param string $html + * @param string $tags_str 多个标签名之间用空格隔开 + * @return string + */ + protected function stripTags($html,$tags_str) + { + $tagsArr = $this->tag($tags_str); + $html = $this->removeTags($html,$tagsArr[1]); + $p = array(); + foreach ($tagsArr[0] as $tag) { + $p[]="/(<(?:\/".$tag."|".$tag.")[^>]*>)/i"; + } + $html = preg_replace($p,"",trim($html)); + return $html; + } + + /** + * 保留特定的html标签 + * @param string $html + * @param string $tags_str 多个标签名之间用空格隔开 + * @return string + */ + protected function allowTags($html,$tags_str) + { + $tagsArr = $this->tag($tags_str); + $html = $this->removeTags($html,$tagsArr[1]); + $allow = ''; + foreach ($tagsArr[0] as $tag) { + $allow .= "<$tag> "; + } + 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)) + { + array_push($tags[1], $arr[1]); + }else{ + array_push($tags[0], $tag); + } + } + return $tags; + } + + /** + * 移除特定的html标签 + * @param string $html + * @param array $tags 标签数组 + * @return string + */ + protected function removeTags($html,$tags) + { + $tag_str = ''; + if(count($tags)) + { + foreach ($tags as $tag) { + $tag_str .= $tag_str?','.$tag:$tag; + } + phpQuery::$defaultCharset = $this->inputEncoding?$this->inputEncoding:$this->htmlEncoding; + $doc = phpQuery::newDocumentHTML($html); + pq($doc)->find($tag_str)->remove(); + $html = pq($doc)->htmlOuter(); + $doc->unloadDocument(); + } + return $html; + } +} \ No newline at end of file diff --git a/src/Kernel.php b/src/Kernel.php index 616686e..c2c004b 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -49,7 +49,7 @@ class Kernel $this->binds[$name] = $provider; } - public function getBind(string $name) + public function getService(string $name) { if(!$this->binds->offsetExists($name)){ throw new ServiceNotFoundException("Service: {$name} not found!"); diff --git a/src/QueryList.php b/src/QueryList.php index a0dac3b..b81b042 100644 --- a/src/QueryList.php +++ b/src/QueryList.php @@ -1,8 +1,4 @@ query = new Query($this); $this->kernel = (new Kernel($this))->bootstrap(); } public function __call($name, $arguments) { - return $this->kernel->getBind($name)->call($this,...$arguments); - } - - - /** - * @return mixed - */ - public function getHtml() - { - return $this->html; - } - - /** - * @param $html - * @return $this - */ - public function setHtml($html) - { - $this->html = $html; - $this->document = phpQuery::newDocumentHTML($this->html); - return $this; - } - - public function find($selector) - { - return (new Dom($this->document))->find($selector); - } - - public function rules(array $rules) - { - $this->rules = $rules; - return $this; - } - - - public function range($range) - { - $this->range = $range; - return $this; - } - - public function removeHead() - { - $html = preg_replace('/.+<\/head>/is','',$this->html); - $this->setHtml($html); - return $this; - } - - public function query($callback = null) - { - $data = $this->getList(); - return is_null($callback)?$data:$data->map($callback); - } - - protected function getList() - { - $data = []; - $document = $this->document; - if (!empty($this->range)) { - $robj = pq($document)->find($this->range); - $i = 0; - foreach ($robj as $item) { - foreach ($this->rules as $key => $reg_value){ - $tags = $reg_value[2] ?? ''; - $iobj = pq($item)->find($reg_value[0]); - switch ($reg_value[1]) { - case 'text': - $data[$i][$key] = $this->allowTags(pq($iobj)->html(),$tags); - break; - case 'html': - $data[$i][$key] = $this->stripTags(pq($iobj)->html(),$tags); - break; - default: - $data[$i][$key] = pq($iobj)->attr($reg_value[1]); - break; - } - - if(isset($reg_value[3])){ - $data[$i][$key] = call_user_func($reg_value[3],$data[$i][$key],$key); - } - } - $i++; - } - } else { - foreach ($this->rules as $key => $reg_value){ - $tags = $reg_value[2] ?? ''; - $lobj = pq($document)->find($reg_value[0]); - $i = 0; - foreach ($lobj as $item) { - switch ($reg_value[1]) { - case 'text': - $data[$i][$key] = $this->allowTags(pq($item)->html(),$tags); - break; - case 'html': - $data[$i][$key] = $this->stripTags(pq($item)->html(),$tags); - break; - default: - $data[$i][$key] = pq($item)->attr($reg_value[1]); - break; - } - - if(isset($reg_value[3])){ - $data[$i][$key] = call_user_func($reg_value[3],$data[$i][$key],$key); - } - - $i++; - } - } + if(method_exists($this->query,$name)){ + $result = $this->query->$name(...$arguments); + }else{ + $result = $this->kernel->getService($name)->call($this,...$arguments); } - phpQuery::$documents = array(); - return collect($data); + return $result; } - /** - * 去除特定的html标签 - * @param string $html - * @param string $tags_str 多个标签名之间用空格隔开 - * @return string - */ - protected function stripTags($html,$tags_str) + public static function __callStatic($name, $arguments) { - $tagsArr = $this->tag($tags_str); - $html = $this->removeTags($html,$tagsArr[1]); - $p = array(); - foreach ($tagsArr[0] as $tag) { - $p[]="/(<(?:\/".$tag."|".$tag.")[^>]*>)/i"; - } - $html = preg_replace($p,"",trim($html)); - return $html; + $instance = self::getInstance(); + return $instance->$name(...$arguments); } - /** - * 保留特定的html标签 - * @param string $html - * @param string $tags_str 多个标签名之间用空格隔开 - * @return string - */ - protected function allowTags($html,$tags_str) + public function __destruct() { - $tagsArr = $this->tag($tags_str); - $html = $this->removeTags($html,$tagsArr[1]); - $allow = ''; - foreach ($tagsArr[0] as $tag) { - $allow .= "<$tag> "; - } - return strip_tags(trim($html),$allow); + $this->destruct(); } - protected function tag($tags_str) + public static function getInstance() { - $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{ - array_push($tags[0], $tag); - } - } - return $tags; + $instance = new self(); + return $instance; } - /** - * 移除特定的html标签 - * @param string $html - * @param array $tags 标签数组 - * @return string - */ - protected function removeTags($html,$tags) + public function destruct() { - $tag_str = ''; - if(count($tags)) - { - foreach ($tags as $tag) { - $tag_str .= $tag_str?','.$tag:$tag; - } - phpQuery::$defaultCharset = $this->inputEncoding?$this->inputEncoding:$this->htmlEncoding; - $doc = phpQuery::newDocumentHTML($html); - pq($doc)->find($tag_str)->remove(); - $html = pq($doc)->htmlOuter(); - $doc->unloadDocument(); - } - return $html; + phpQuery::$documents = []; } + + } \ No newline at end of file diff --git a/src/Services/EncodeService.php b/src/Services/EncodeService.php index 2c5a612..6f03255 100644 --- a/src/Services/EncodeService.php +++ b/src/Services/EncodeService.php @@ -3,20 +3,35 @@ * Created by PhpStorm. * User: Jaeger * Date: 2017/9/20 + * 编码转换服务 */ namespace QL\Services; +use QL\QueryList; + class EncodeService { - public static function convert($ql,string $outputEncoding,string $inputEncoding = null) + public static function convert(QueryList $ql,string $outputEncoding,string $inputEncoding = null) { - dump($outputEncoding,$inputEncoding); + $html = $ql->getHtml(); + $inputEncoding || $inputEncoding = self::detect($html); + $html = iconv($inputEncoding,$outputEncoding.'//IGNORE',$html); + $ql->setHtml($html); return $ql; } - public static function detect() + /** + * Attempts to detect the encoding + * @param $string + * @return bool|false|mixed|string + */ + public static function detect($string) { - + $charset=mb_detect_encoding($string, array('ASCII', 'GB2312', 'GBK', 'UTF-8'),true); + if(strtolower($charset)=='cp936') + $charset='GBK'; + return $charset; } + } \ No newline at end of file