phpquery 使用方法
最近在做静态页生成项目中,需要先对HTML内容进行解析数据插入和内容替换等操作,最开始想到全部用正则来解决,测试了下html结构太复杂了。全部用正则不显示。然后想到把html转成对象来操作,正好查了一下gpt,有很多库可以来解析HTML。现在用的后端语言是PHP。下面可以用的几个库1、DomDocument:这是PHP自带的内置类,可以解析和操作HTML文档,提供了许多强大的方法和函数。它的文档对象模型(DOM)适用于大多数HTML解析和替换任务。2、Simple HTML DOM:这是一个第三方库,提供了一组简单易用的方法来解析和操作HTML文档。它类似于jQuery,可以使用CSS选择器来遍历和操作HTML元素。3、PHPQuery:这是一个强大的第三方库,可以将HTML文档转换为类似于jQuery语法的对象模型。它提供了许多方便的方法和函数,使HTML解析和替换变得更加简单和灵活。4、Simplepie:这是一个针对RSS和Atom等XML文档的组件,但它也可以用于解析HTML文档。它提供了一组易用的方法和函数,用于解析和替换HTML标记和内容。最开始我用的是Simple HTML DOM,但是在使用过程中发现,某些节点内容替换不了,节点原始内容我也打印出来了,需要替换掉内容也打印出来,都没问题,就是替换不了。最终没找到原因,所以我改成用PHPQuery,同样的操作最后解决了。怎么说,使用上来说,PHPQuery要顺手一些。phpQuery库下载地址: https://code.google.com/archive/p/phpquery/downloads (需要翻墙)我下载了一份到阿里云盘,可以直接用phpQuery: https://www.aliyundrive.com/s/WCB2NR7sdCm 提取码: w01k 引入phpquery类库//直接引入 include 'phpQuery/phpQuery.php';类似laravel框架引入方法://1、首先在app目录下创建一个新的文件夹,命名libs(可自定义),在libs下再创建一个phpQuery文件夹 //2、找到根目录下的composer.json文件 //3、找到composer.json中定义的 "autoload": { "classmap": [ "database", "app/libs/phpQuery" //加上 ], "psr-4": { "App\\": "app/" } }, //composer加载文件 composer dumpautoload使用方法加载文件 newDocument<?php header("Content-Type: text/html;charset=utf-8"); require('phpQuery/phpQuery.php'); /*通过读取URL或则文件路径 返回值是该网站或文件的html,一个网页对应着一个html文件*/ /*eg 1*/ $eg1=phpQuery::newDocumentFile("test.htm"); /*eg 2*/ $eg2=phpQuery::newDocumentFile("http://www.baidu.com"); //可以通过echo htmlentities($eg1,ENT_QUOTES,"UTF-8");查看返回值。注意htmlentities()函数可以输出原始html代码。 /*eg 3*/ //读入html $html="<div> <ul> <li>第一行</li> <li>第二行</li> </ul> </div"; $eg3=phpQuery::newDocument($html);//输入入参数为html ?> 【基本选择器】 #id 根据给定的ID属性匹配单个元素。 element 根据给定的名称匹配所有符合的元素。 .class 根据给定的class匹配所有的元素。 * 选择所有元素。 selector1, selector2, selectorN 根据所有制定的选择器匹配结合结果 选择结果是取并集/* 基本选择器*/ 1) #id pq("#myDiv"); 2) element pq("div"); 3) .class pq(".myClass"); 4) * pq("*") 5) selector1,selectorN pq("div,span,p.myClass") 【层次选择器】 ancestor descendant 匹配由先祖指定的元素的后代指定的所有后代元素。 parent > child 匹配由父元素指定的子元素指定的所有子元素。 prev + next 根据指定的”next”和指定的”prev”匹配所有的下一个元素。 prev ~ siblings 匹配根据”prev” 元素的 所有相邻元素。/* 层次选择器*/ 1) ancestor descendant pq("form input") 2) parent > child pq("form > input") 3) prev + next pq("label + input") 4) prev ~ siblings pq("form ~ input")【基础过滤 】 :first 匹配第一个被选择的元素。 :last 匹配最后一个被选择的元素。 :not(selector) 匹配所有不是被选择的元素。 :even 匹配所有被选择的偶数元素,0索引。 :odd 匹配所有被选择的奇数元素,0索引。 :eq(index) 匹配等同于给定的索引的元素。 :gt(index) 匹配大于给定的索引的元素。 :lt(index) 匹配小于给定的索引的元素。 :header 匹配所有header元素,如h1,h2,h3等。 :animated 匹配正在进行动画效果的元素。/*基础过滤*/ 1) :first pq("tr:first") 2) :last pq("tr:last") 3) :not(selector) pq("input:not(:checked)") 4) :even pq("tr:even") 5) :odd pq("tr:odd") 6) :eq(index) pq("tr:eq(1)") 7) :gt(index) pq("tr:gt(0)") 8) :lt(index) pq("tr:lt(2)") 9) :header pq(":header").css("background", "#EEE"); 【内容过滤】 :contains(text) 匹配包含指定文本的元素。 :empty 匹配所有无子节点的元素(包括文本节点)。 :has(selector) 匹配至少包含一个对于给定选择器的元素。 :parent 匹配所有父元素 - 拥有子元素的,包括文本。/*内容过滤*/ 1) :contains(text) pq("div:contains('John')") 2) :empty pq("td:empty") 3) :has(selector) pq("div:has(p)").addClass("test"); 4) :parent pq("td:parent") 【属性过滤】 [attribute] 匹配给定属性的元素。 [attribute=value] 匹配给定属性等于确定值的元素。 [attribute!=value] 匹配给定属性不等于确定值的元素。 [attribute^=value] 匹配给定属性是确定值开始的元素。 [attribute$=value] 匹配给定属性是确定值结尾的元素。 [attribute*=value] 匹配给定属性包含确定值的元素。 [selector1selector2selectorN] 匹配给定属性并且包含确定值的元素。1) [attribute] pq("div[id]") 2) [attribute=value] pq("input[name='newsletter']").attr("checked", true); 3) [attribute!=value] pq("input[name!='newsletter']").attr("checked", true); 4) [attribute^=value] pq("input[name^='news']") 5) [attribute$=value] pq("input[name$='letter']") 6) [attribute*=value] pq("input[name*='man']") 7) [selector1][selectorN] pq("input[id][name$='man']") 【子元素过滤 】 :nth-child(index/even/odd/equation) 匹配所有是父元素的第n个的子元素,或者是父元素的偶数或者奇数子元素。 :first-child 匹配所有是父元素的第一个的子元素。 :last-child 匹配所有是父元素的最后一个的子元素。 :only-child 匹配所有是父元素唯一子元素的子元素。1) :nth-child(index/even/odd/equation) pq("ul li:nth-child(2)") 2) :first-child pq("ul li:first-child") 3) :last-child pq("ul li:last-child") 4) :only-child pq("ul li:only-child") 【基于表单 】 :input 匹配input, textarea, select和button元素。 :text 匹配所有类型为text的input元素。 :password 匹配所有类型为password的input元素。 :radio 匹配所有类型为radio的input元素。 :checkbox 匹配所有类型为checkbox的input元素。 :submit 匹配所有类型为submit的input元素。 :image 匹配所有类型为image的input元素。 :reset 匹配所有类型为reset的input元素。 :button 匹配所有类型为button的input元素和button元素。 :file 匹配所有类型为file的input元素。 :hidden 匹配所有类型为hidden的input元素或者其他hidden元素。1) :input pq(":input") 2) :text pq(":text") 3) :password pq(":password") 4) :radio pq(":radio") 5) :checkbox pq(":checkbox") 6) :submit pq(":submit") 7) :image pq(":image") 8) :reset pq(":reset") 9) :button pq(":button") 10) :file pq(":file") 11) :hidden pq("tr:hidden") 【表单过滤 】 :enabled 匹配所有可用元素。 :disabled 匹配所有不可用元素。 :checked 匹配所有被勾选的元素。 :selected 匹配所有被选择的元素。1) :enabled pq("input:enabled") 2) :disabled pq("input:disabled") 3) :checked pq("input:checked") 4) :selected pq("select option:selected") 【attr属性获取】 attr($name) 访问第一个给名称的元素的属性。这个方法可以很轻易地取得第一个匹配到的元素的属性值。如果这个元素没有对应名称的属性则返回undefined。 attr($properties) 对于所有匹配到的元素设置对应属性。 attr($key, $value) 对于匹配到的元素设置一个属性和对应值。 attr($key, $fn) 对于匹配到的元素设置一个属性和需要计算的值。 removeAttr($name) 对匹配到的元素移除给定名称的属性。 addClass($class) 对匹配到的元素添加一个给定的类。 hasClass($class) 如果有至少一个匹配到的元素包含给定的类则返回true。 removeClass($class) 对匹配到的元素移除给定名称的类。 toggleClass($class) 对匹配到的元素,如果类不存在则添加,如果存在则移除。1) attr pq("img")->attr("src"); 2) attr(properties) pq("img")->attr({ src: "test.jpg", alt: "Test Image" }); 3) attr(key,value) pq("img")->attr("src","test.jpg"); 4) attr(key,fn) pq("img")->attr("title", function() { return this.src }); 5) removeAttr(name) pq("img")->removeAttr("src"); 6) addClass(class) pq("p")->addClass("selected"); 7) removeClass(class) pq("p")->removeClass("selected"); 8) toggleClass(class) pq("p")->toggleClass("selected"); 【HTML获取】 html() 获取第一个匹配到的元素的html内容(innerHTML)。这个方法不适用于XML文本(但适用于XHTML。) html($val) 对匹配到的元素设置html内容。这个方法不适用于XML文本(但适用于XHTML。)1) html() pq("div")->html(); 2) html(val) pq("div")->html("<p>Hello Again</p>");【text获取】 text() 获取匹配到的所有元素的文本内容。 text($val) 对匹配到的所有元素设置文本内容。1) text() pq("p")->text(); 2) text(val) pq("p")->text("<b>Some</b> new text.");【Value 获取】 val() 获取匹配到的第一个元素的value属性的值。 val($val) 对匹配到的元素设置value值。val($val) 所有的Checks, selects, radio buttons, checkboxes,和select options都会设置相应给定的值。1) val() pq("input")->val(); 2) val(val) pq("input")->val("hello world!")【其他筛选和文档处理】\*筛选*\ 1) eq(index) pq("p")->eq(1) 2) hasClass(class) pq("div")->hasClass("protected") 3) filter(expr) pq("p")->filter(".selected") 4) filter(fn) pq("p")->filter(function($index) { return pq("ol", pq($index))->size() == 0; }); 5) is(expr) pq("input[type='checkbox']")->parent()->is("form") 6) map(callback) pq("p")->append(pq("input").map(function(){ return pq(this)->val(); })->get()->join(", ")); 7) not(expr) pq("p")->not(pq("#selected")[0]) 8) slice(start,[end]) pq("p")->slice(0, 1)->wrapInner("<b></b>"); 9) add(expr) pq("p")->add("span") 10) children([expr]) pq("div")->children() 11) contents() pq("p")->contents()->not("[@nodeType=1]").wrap("<b/>"); 12) find(expr) pq("p")->find("span") 13) next([expr]) pq("p")->next() 14) nextAll([expr]) pq("div:first")->nextAll()->addClass("after"); 15) parent([expr]) pq("p")->parent() 16) parents([expr]) pq("span")->parents() 17) prev([expr]) pq("p").prev() 18) prevAll([expr]) pq("div:last")->prevAll()->addClass("before"); 19) siblings([expr]) pq("div")->siblings() 20) andSelf() pq("div")->find("p")->andSelf()->addClass("border"); 21) end() pq("p")->find("span")->end() \*文档处理*\ 1) append(content) pq("p")->append("<b>Hello</b>"); 2) appendTo(content) pq("p")->appendTo("#foo"); 3) prepend(content) pq("p")->prepend("<b>Hello</b>"); 4) prependTo(content) pq("p")->prependTo("#foo"); 5) after(content) pq("p")->after("<b>Hello</b>"); 6) before(content) pq("p")->before("<b>Hello</b>"); 7) insertAfter(content) pq("p")->insertAfter("#foo"); 8) insertBefore(content) pq("p")->insertBefore("#foo"); 9) wrap(html) pq("p")->wrap("<div class='wrap'></div>"); 10) wrap(elem) pq("p")->wrap(pq("#content")); 11) wrapAll(html) pq("p")->wrapAll("<div></div>"); 12) wrapAll(elem) pq("p")->wrapAll(pq("#content")); 13) wrapInner(html) pq("p")->wrapInner("<b></b>"); 14) wrapInner(elem) pq("p")->wrapInner(pq(".content")); 15) replaceWith(content) pq("p")->replaceWith("<b>Paragraph. </b>"); 16) replaceAll(selector) pq("<b>Paragraph. </b>")->replaceAll("p"); 17) empty() pq("p")->empty(); 18) remove([expr]) pq("p")->remove(); 19) clone() pq("b")->clone()->prependTo("p"); 20) clone(true) pq("button")->clone(true)->insertAfter(pq("b")) 示例:$phpQueryDom=phpQuery::newDocument($html); $itemDom=$phpQueryDom->find("blockitems").eq(0); $block = ""; $blockDom =$itemDom->find('[blockitem]')->eq(0); //循环产品数据 foreach ($product as $pro){ $blockDom->find("[blocktitle]")->text($pro->title); $blockDom->find("a")->eq(0)->attr("href","/product/".$pro->id); $blockDom->find("[blockimagetype]")->attr("src",$this->getImageUrl(json_decode($pro->thumb)->url)); $blockicotypeUrl = $this->getImageUrl(json_decode($pro->icon)[0]); $blockDom->find("[blockicotype]")->attr("style","background-image:url('.$blockicotypeUrl.');background-position:center !important;"); $block.=$blockDom->htmlOuter(); } $isBlockitems = $itemDom->attr("blockitems"); //判断blockitems属性是否在当前节点上 if ($isBlockitems !== null){ $itemDom->html($block); }else{ $itemDom->find("[blockitems]")->eq(0)->html($block); }参考链接: https://blog.51cto.com/lxw1844912514/2941913 https://code.google.com/archive/p/phpquery/downloads https://www.lmlphp.com/user/57840/article/item/2351270/
查看详情点赞1评论收藏浏览1692023-07-26 14:09:39一款优雅方便的【思维导图】,博主吐血推荐!
今天给大家推荐一款非常优雅的思维导图,和百度脑图一样。都是基于kityminder的百度开源脑图工具。为什么使用它?1、界面非常好看,外观有很多种选择2、速度非常快,编辑也非常丝滑3、可以保存到后台个人思维脑图管理中心,不管在哪里只有有网都可以拿出电脑随时随地打开它。极大的方便了工具。4、不想让其他人访问你的思维导图,可以设置成私密,这样别人就无权访问。也可以设置成公开,让其他所有人浏览。如果只想让某一部分人查看,那你可以设置成分享。通过密码的方式分享亲朋好友查看。5、可以不用本地安装脑图工具,节省电脑硬盘和内存。不用本地打开软件6、说了那么多,主要是这款脑图开源免费,重点是免费。7、工具地址:http://www.alingfeng.cn/tools/flow下面是一些截图:后台思维导图个人管理中心外观很多,都很漂亮。大家可以自行研究喜欢哪款。
查看详情点赞1评论1收藏浏览2162023-07-20 09:56:23php HTML解析库用法,PHP玩转HTML(SimpleHtmlDom)
我们在生成静态页中,经常会遇到需要处理html文档,里面需要用到很多节点,插入各种动态数据,修改各种内容。我们首先想到用正则匹配内容然后修改,这样也可以的。今天我们学习一个PHP的HTML解析库,用它来处理html文档。A HTML DOM parser written in PHP - let you manipulate HTML in a very easy way! This is a fork of PHP Simple HTML DOM Parser project but instead of string manipulation we use DOMDocument and modern php classes like "Symfony CssSelector".PHP 7.0+ & 8.0 SupportPHP-FIG StandardComposer & PSR-4 supportPHPUnit testing via Travis CIPHP-Quality testing via SensioLabsInsightUTF-8 Support (more support via "voku/portable-utf8")Invalid HTML Support (partly ...)Find tags on an HTML page with selectors just like jQueryExtract contents from HTML in a single line引入:使用composer下载库composer require voku/simple_html_dom composer require voku/portable-utf8使用:use voku\helper\HtmlDomParser; require_once 'composer/autoload.php'; ... $dom = HtmlDomParser::str_get_html($str); // or $dom = HtmlDomParser::file_get_html($file); $element = $dom->findOne('#css-selector'); // "$element" === instance of "SimpleHtmlDomInterface" $elements = $dom->findMulti('.css-selector'); // "$elements" === instance of SimpleHtmlDomNodeInterface<int, SimpleHtmlDomInterface> $elementOrFalse = $dom->findOneOrFalse('#css-selector'); // "$elementOrFalse" === instance of "SimpleHtmlDomInterface" or false $elementsOrFalse = $dom->findMultiOrFalse('.css-selector'); // "$elementsOrFalse" === instance of SimpleHtmlDomNodeInterface<int, SimpleHtmlDomInterface> or false ...从url中加载html文档从字符串中加载html文档从文件中加载html文档// 新建一个Dom实例 $html = new simple_html_dom(); // 从url中加载 $html->load_file('http://www.alingfeng.cn'); // 从字符串中加载 $html->load('<html><body>从字符串中加载html文档演示</body></html>'); //从文件中加载 $html->load_file('path/file/test.html'); //创建HTML文档 // Create a DOM object from a string $html = str_get_html('<html><body>Hello!</body></html>'); // Create a DOM object from a URL $html = file_get_html('http://www.google.com/'); // Create a DOM object from a HTML file $html = file_get_html('test.htm'); 查找html元素可以使用find函数来查找html文档中的元素。返回的结果是一个包含了对象的数组。我们使用HTML DOM解析类中的函数来访问这些对象,下面给出几个示例://查找html文档中的超链接元素 $a = $html->find('a'); //查找文档中第(N)个超链接,如果没有找到则返回空数组. $a = $html->find('a', 0); // 查找id为main的div元素 $main = $html->find('div[id=main]',0); // 查找所有包含有id属性的div元素 $divs = $html->find('div[id]'); // 查找所有包含有id属性的元素 $divs = $html->find('[id]'); // 查找id='#container'的元素 $ret = $html->find('#container'); // 找到所有class=foo的元素 $ret = $html->find('.foo'); // 查找多个html标签 $ret = $html->find('a, img'); // 还可以这样用 $ret = $html->find('a[title], img[title]'); // 查找 ul列表中所有的li项 $ret = $html->find('ul li'); //查找 ul 列表指定class=selected的li项 $ret = $html->find('ul li.selected'); // 返回父元素 $e->parent; // 返回子元素数组 $e->children; // 通过索引号返回指定子元素 $e->children(0); // 返回第一个资源速 $e->first_child (); // 返回最后一个子元素 $e->last _child (); // 返回上一个相邻元素 $e->prev_sibling (); //返回下一个相邻元素 $e->next_sibling ();元素属性操作使用简单的正则表达式来操作属性选择器。[attribute] – 选择包含某属性的html元素[attribute=value] – 选择所有指定值属性的html元素[attribute!=value]- 选择所有非指定值属性的html元素[attribute^=value] -选择所有指定值开头属性的html元素[attribute$=value] 选择所有指定值结尾属性的html元素[attribute*=value] -选择所有包含指定值属性的html元素// 本例中将$a的锚链接值赋给$link变量 $link = $a->href; $link = $html->find('a',0)->href;每个对象都有4个基本对象属性:tag – 返回html标签名innertext – 返回innerHTMLoutertext – 返回outerHTMLplaintext – 返回html标签中的文本//给$a的锚链接赋新值 $a->href = 'http://www.jb51.net'; // 删除锚链接 $a->href = null; // 检测是否存在锚链接 if(isset($a->href)) { //代码 }解析器中没有专门的方法来添加、删除元素,不过可以变通一下使用:// 封装元素 $e->outertext = '<div class="wrap">' . $e->outertext . '<div>'; // 删除元素 $e->outertext = ''; // 添加元素 $e->outertext = $e->outertext . '<div>foo<div>'; // 插入元素 $e->outertext = '<div>foo<div>' . $e->outertext; $doc = $html; // 输出 echo $doc; //如何避免解析器消耗过多内存 $html->clear();简单示例:$html = file_get_html('http://www.alingfeng.cn/');//获取html $dom = new simple_html_dom(); //new simple_html_dom对象 $dom->load($html) //加载html // Find all images foreach($dom->find('img') as $element) { //获取img标签数组 echo $element->src . '<br>'; //获取每个img标签中的src } // Find all links foreach($dom->find('a') as $element){ //获取a标签的数组 echo $element->href . '<br>';//获取每个a标签中的href } $html = file_get_html('http://slashdot.org/'); //获取html $dom = new simple_html_dom(); //new simple_html_dom对象 $dom->load($html); //加载html // Find all article blocks foreach($dom->find('div.article') as $article) { $item['title'] = $article->find('div.title', 0)->plaintext; //plaintext 获取纯文本 $item['intro'] = $article->find('div.intro', 0)->plaintext; $item['details'] = $article->find('div.details', 0)->plaintext; $articles[] = $item; } print_r($articles); // Create DOM from string $html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>'); $dom = new simple_html_dom(); //new simple_html_dom对象</p><p> $dom->load($html); //加载html $dom->find('div', 1)->class = 'bar'; //class = 赋值 给第二个div的class赋值</p><p> $dom->find('div[id=hello]', 0)->innertext = 'foo'; //innertext内部文本</p><p> echo $dom;find示例:find ( string $selector [, int $index] ) // Find all anchors, returns a array of element objects a标签数组 $ret = $html->find('a');</p><p> // Find (N)th anchor, returns element object or null if not found (zero based)第一个a标签 $ret = $html->find('a', 0);</p><p> // Find lastest anchor, returns element object or null if not found (zero based)最后一个a标签 $ret = $html->find('a', -1); </p><p> // Find all <div> with the id attribute $ret = $html->find('div[id]');</p><p> // Find all <div> which attribute id=foo $ret = $html->find('div[id=foo]'); </p><p> // Find all element which id=foo $ret = $html->find('#foo');</p><p> // Find all element which class=foo $ret = $html->find('.foo');</p><p> // Find all element has attribute id $ret = $html->find('*[id]'); </p><p> // Find all anchors and images a标签与img标签数组 $ret = $html->find('a, img'); </p><p> // Find all anchors and images with the "title" attribute $ret = $html->find('a[title], img[title]');</p><p> // Find all <li> in <ul> $es = $html->find('ul li'); ul标签下的li标签数组</p><p> // Find Nested <div> tags $es = $html->find('div div div'); div标签下div标签下div标签数组</p><p> // Find all <td> in <table> which class=hello $es = $html->find('table.hello td'); table标签下td标签数组</p><p> // Find all td tags with attribite align=center in table tags $es = $html->find(''table td[align=center]'); </p><p> //5.Element //的方法 $e = $html->find("div", 0); //$e 所拥有的方法如下表所示 //Attribute Name Usage $e->tag //标签 $e->outertext //外文本 $e->innertext //内文本 $e->plaintext //纯文本 </p><p> </p><p> // Example $html = str_get_html("<div>foo <b>bar</b></div>"); echo $e->tag; // Returns: " div" echo $e->outertext; // Returns: " <div>foo <b>bar</b></div>" echo $e->innertext; // Returns: " foo <b>bar</b>" echo $e->plaintext; // Returns: " foo bar"</p><p> /6.DOM traversing 方法 //Method Description mixed$e->children ( [int $index] ) //子元素 element$e->parent () //父元素 element$e->first_child () //第一个子元素 element$e->last_child () //最后一个子元素 element$e->next_sibling () //后一个兄弟元素 element$e->prev_sibling () //前一个兄弟元素 </p><p> // Example echo $html->find("#div1", 0)->children(1)->children(1)->children(2)->id; // or echo $html->getElementById("div1")->childNodes(1)->childNodes(1)->childNodes(2)->getAttribute('id');参考链接: https://github.com/voku/simple_html_dom https://blog.csdn.net/qq_36025814/article/details/89500333
查看详情点赞评论1收藏浏览1272023-07-11 11:50:15Stable diffusion本地部署初体验
博主最近也在跟风,在网上找一些AI绘图的工具,国外国内基本都了解了一下,工具很多热门的不多,DALL·E,Midjourney,Stable Diffusion,文心一格,通义万象等。映象最深的应该还是这两个,Midjourney,Stable Diffusion,论画质,普遍Midjourney都要高一些,更加逼真,Stable Diffusion更偏向艺术和创作,当然真正的高手创作出来的图也有比Midjourney更震撼,上限很高,不喜勿喷只是个人感觉,毕竟我不是专业的。作为一个白嫖党,外加喜欢研究的我来说,Stable Diffusion才是香。网上看了一些资料,也有很多教程,然后我跟着网上的工具本地搭了一个(教程有很多),用了一些简单的模型和描述生成了一些图,总体来说,很不错,如果是设计专业的来弄,画图面应该更加好看,网上也有各种已经训练好的模型供大家使用,有兴趣的朋友可以尝试一下,主要是免费,随便造,原创。下面就分享一下网友和我生成的图,图片来自互联网和我生成的,如有涉及侵权请及时告知我删除。
查看详情点赞1评论收藏1浏览2142023-07-08 09:58:05shell 创建conf文件,并写入内容(shell创建nginx vhost配置文件)
点赞评论收藏浏览712023-06-30 14:56:24沉浸式翻译 --一键开启双语阅读,提升信息获取效率
随着谷歌翻译退出中国市场,市场上迫切需要一款能够替代谷歌翻译的工具。在这个背景下,沉浸式翻译应运而生,成为一款备受关注的翻译工具。 沉浸式翻译是一款浏览器插件,官方网址为: https://immersivetranslate.com/ ,它可以智能识别网页主内容区进行双语翻译,插件支持全平台浏览器,PDF文件翻译,EPUB电子书双语翻译、制作、导出,字幕文件翻译等功能。 沉浸式翻译是一款全面支持80多种语言翻译的工具。以下是该工具的主要特点和功能解释: 1. 多语言支持:沉浸式翻译可以翻译80多种语言,让您轻松应对各种语言交流需求。 2. 自定义翻译服务:您可以自由选择多种翻译服务,以满足个性化的翻译偏好。 3. 翻译设置定制:您可以自定义哪些语种需要翻译,哪些语种不需要翻译,甚至可以设定特定网址的翻译与否。 4. 双语对照显示:沉浸式翻译的界面同时显示原语言和翻译后的语言,方便您进行一一对照,确保准确性。 5. 多样化译文样式:您可以根据个人喜好设置多种译文样式,包括字体、颜色等,以使翻译结果更加符合您的偏好。 6. 配置导入导出:支持导入和导出配置,方便您在不同设备间进行设置同步或备份。 7. 免费使用:最重要的是,沉浸式翻译是免费使用的,为您提供便捷的翻译服务,无需支付任何费用。 推荐使用!
查看详情点赞13评论1收藏1浏览2302023-06-30 09:59:22shell脚本读取PHP文件数组的值,放到shell变量中使用方法
今天在用shell执行PHP文件,需要读取PHP数组中的一些值的时候。遇到了问题,找了很多资料,最后问了AI。经常一翻和AI的纠缠。终于给了我正确的答案,整理如下。事实证明AI真强大。PHP文件中的数组:web_data.php<?php $web_data = [ "port"=>"10764", "secret"=>"LU2DuzNpi94Ff8jastAscGvv2HbGK2UJ", "mainDoain"=>"lxl.petuu.shop", "domain"=>"", 'mysqlUser' => "userName", 'mysqlPassword' => "gehrht1646", ]; return $web_data;shell脚本中写法:projectName=$(php -r 'include "web_data.php"; echo $web_data["mainDoain"];') echo $projectName搞定
查看详情点赞2评论收藏浏览1182023-06-29 16:24:24Codeium --A Free AI-Powered Toolkit for Developers
简介: Codeium是一款强大的智能代码提示工具,它能够提供高效的代码补全和建议,帮助开发者提升编码速度和质量。本文将介绍Codeium的基本信息、安装和使用方法,并与类似工具GitHub Copilot和Bito进行比较,最后总结其优缺点。一、Codeium的介绍 Codeium是一款基于人工智能技术的代码提示工具,它能够分析上下文、语法和常见编码模式,为开发者提供准确的代码补全和建议。Codeium支持多种编程语言和集成开发环境(IDE),并且具有高度可定制性,可以根据个人喜好和项目需求进行配置。二、Codeium的安装和使用 1. 安装Codeium:在官方网站( https://codeium.com/ )下载适用于你的操作系统的安装包,并按照提示进行安装。 2. 配置Codeium:打开你的IDE,找到Codeium的插件管理器,将Codeium插件添加到你的IDE中,并进行必要的配置。 3. 使用Codeium:在编码过程中,Codeium会自动分析你的代码,并在你输入代码时提供智能的代码补全和建议。你可以通过键盘快捷键或鼠标选择来接受Codeium的建议。三、Codeium相比GitHub Copilot和Bito的优缺点 1. Codeium vs. GitHub Copilot: - 优点: - Codeium支持更多的编程语言和IDE,适用范围更广。 - Codeium具有更高的可定制性,可以根据个人喜好进行配置。 - Codeium的代码建议更加准确和智能。 - 缺点: - Codeium的学习曲线相对较陡峭,需要一定时间来适应和掌握。 - Codeium的插件可能会占用一定的系统资源,对低配置设备可能不太友好。 2. Codeium vs. Bito: - 优点: - Codeium和Bito都是由Bito开发的工具,可以相互兼容和补充。 - Codeium和Bito都具有智能代码提示的功能,提升开发效率。 - 缺点: - Codeium和Bito在支持的编程语言和IDE方面可能存在差异,需要根据具体需求进行选择。四、总结 Codeium是一款功能强大的智能代码提示工具,通过准确的代码补全和建议,能够提高开发者的编码效率和质量。与类似工具GitHub Copilot和Bito相比,Codeium在支持范围、可定制性和代码建议方面具有一定优势。然而,使用Codeium需要一定的学习成本,并且可能对低配置设备不太友好。综上所述,开发者可以根据自己的需求和偏好选择适合自己的智能代码提示工具。
查看详情点赞1评论1收藏1浏览872023-06-29 09:42:46Bito --10x faster with ChatGPT
一、引言 1. AI工具的重要性和应用范围:AI工具在现代社会中扮演着重要角色,并在各个领域有广泛应用。首先,AI工具能够处理和分析大量的数据,从而帮助人们做出更准确的决策。在医疗领域,AI工具可以通过分析病人的病历和症状,提供更准确的诊断和治疗方案。在金融领域,AI工具可以分析市场趋势和风险,帮助投资者做出更明智的投资决策。在交通领域,AI工具可以优化交通流量和减少交通事故,提高交通效率和安全性。 2. 引入Bito工具的背景和目的:选择介绍Bito工具是因为它在解决现实问题中发挥着重要作用。Bito工具是一种基于AI技术的智能客服工具,旨在提供高效的客户服务和支持。在现实生活中,许多企业和组织需要处理大量的客户咨询和问题,传统的客服方式往往效率低下且耗时。而Bito工具通过利用AI技术,能够自动回答常见问题、提供个性化的解决方案,并且可以随时为客户提供支持。这不仅提高了客户满意度,也减轻了企业的工作负担。因此,介绍Bito工具可以帮助读者了解如何利用AI工具来解决现实生活中的问题,并提高工作效率。二、Bito工具介绍 1. Bito的定义和特点:Bito是一个基于人工智能的工具,它采用先进的算法和技术,具有高度灵活性和可定制性。Bito可以被用于构建各种类型的AI应用,包括自然语言处理、图像识别、数据分析等。它可以通过学习和适应不同的数据和环境,以提供个性化的解决方案。 2. Bito的主要功能和用途:Bito具有多种主要功能,包括数据处理、模型训练和预测分析等。在数据处理方面,Bito可以对大量的数据进行清洗、整理和转换,以便后续的分析和建模。在模型训练方面,Bito可以使用机器学习算法和深度学习模型,对数据进行训练和优化,以提取有用的信息和进行预测分析。这些功能使得Bito在各种实际应用中发挥重要作用,如自动化客户服务、智能推荐系统、风险预测等。 3. Bito的优势和区别于其他AI工具的特点:相对于其他AI工具,Bito具有一些独特的优势。首先,Bito具有易用性,它提供了友好的界面和工具,使得用户可以轻松地构建和使用AI应用,无需深入的编程知识。其次,Bito具有高效性,它采用高效的算法和技术,能够在短时间内处理大量的数据和任务。此外,Bito还具有可扩展性,它可以根据用户的需求进行定制和扩展,以适应不同的应用场景和数据类型。这些特点使得Bito成为一个强大而灵活的AI工具,能够帮助用户解决各种实际问题。三、Bito工具的安装 1. 系统要求和兼容性:Bito工具的最低系统要求包括操作系统、处理器和内存等方面。通常,Bito可以在主流的操作系统上运行,如Windows、Mac OS和Linux。对于处理器,建议使用至少双核处理器以确保流畅的运行。此外,Bito还需要一定的内存空间来处理数据和运行算法,建议至少4GB的内存。 2. 下载和安装步骤: 下载和安装Bito工具可以按照以下步骤进行: 1). 打开Bito官方网站( https://bito.ai/ ),并找到下载页面。 2). 选择适合您操作系统的版本,并点击下载按钮。 3). 下载完成后,双击安装文件以启动安装程序。 4). 根据安装向导的指示,选择安装位置和其他选项。 5). 点击“安装”按钮开始安装过程。 6). 等待安装完成,然后点击“完成”按钮退出安装程序。 3. 配置和设置: 安装完成后,您可能需要进行一些配置和设置以确保Bito工具的正常运行。这些配置和设置可能包括以下方面: 1.) 运行环境设置:根据您的需求,设置Bito的运行环境,如默认存储位置、日志记录等。 2). 数据源配置:如果您需要使用外部数据源,例如数据库或API,您可能需要配置相关的连接参数和认证信息。 3). 模型参数设置:根据您的任务和数据类型,设置模型的参数和选项,以获得最佳的性能和结果。 4). 用户权限设置:如果您需要多用户访问和管理Bito工具,您可以设置不同用户的权限和访问控制。 具体的配置和设置过程可能因Bito的版本和具体应用而有所不同,请参考官方文档或用户手册以获取更详细的指导。 四、Bito工具的使用 1. 基本功能和界面导览:Bito工具的基本功能包括数据导入、处理流程设计、模型训练和结果分析等。界面导览可以展示Bito的主要界面和功 能模块,以便用户快速了解和使用。 2. 数据输入和处理:演示如何输入和处理数据是Bito工具的核心功能之一。用户可以通过导入CSV文件、数据库连接或API调用等方式将数据导入Bito,并使用内置的数据处理功能进行清洗、转换和特征工程等操作。 3. 模型训练和优化:Bito工具提供了各种机器学习算法和模型训练方法,用户可以根据自己的需求选择合适的算法和参数进行模型训练和优化。这部分可以通过示例代码或训练过程的截图来展示。 4. 结果分析和可视化:Bito工具提供了丰富的结果分析和可视化功能,用户可以通过绘制图表、生成报告或使用交互式可视化工具来分析和展示训练结果。这部分可以介绍如何使用Bito的可视化功能来展示模型的性能和预测结果。 5. 其他高级功能和扩展性:除了基本功能外,Bito工具还提供了一些高级功能和扩展性选项,如模型部署、自动化流程和集成开发环境等。这些功能可以提高用户的工作效率和模型的可扩展性。 五、Bito工具的当前局限 1. 工具的限制和局限性:Bito工具目前可能存在一些限制和局限性。例如,处理大规模数据时可能会受到内存和计算资源的限制,特定算法可能没有完全支持或性能较低。这些限制和局限性可以在文档中进行列举和说明,以便用户在使用工具时有所准备。 2. 可能的问题和挑战:在使用Bito工具时,用户可能会遇到一些问题和挑战。例如,数据预处理过程中可能遇到缺失值或异常值的处理问题,模型训练过程中可能需要调试参数或选择合适的算法等。为了帮助用户克服这些问题和挑战,可以提供解决方案、建议或常见错误的排查方法。 3. 目前用户反馈和改进计划:引用来自用户的反馈可以展示Bito工具的实际使用情况和用户体验。可以提及用户对工具功能、性能或用户界面的反馈,并说明Bito团队正在进行的改进计划。这可以让用户知道工具的发展方向和未来的改进计划,增加用户的信心和参与度。 六、Bito工具的未来发展方向 1. 可能的增强功能和新特性:展望Bito工具未来可能的增强功能和新特性,可以包括更多的预训练模型供用户选择,提供更强大的分布式计算能力以处理更大规模的数据,支持更多的算法和模型类型等。这些增强功能和新特性可以提高工具的灵活性、性能和适用范围,为用户提供更多选择和更好的体验。 2. 预期的技术进步和应用领域:探讨AI技术的发展趋势可以包括深度学习模型的进一步优化和创新,自动化机器学习的发展,以及与其他技术领域的融合等。同时,说明Bito工具在不同领域中的应用前景,例如在医疗领域中的疾病诊断和药物研发,金融领域中的风险预测和交易分析,以及智能驾驶和物联网等领域的应用。 3. 开发团队的发展计划和愿景:介绍Bito团队的发展计划和愿景可以包括团队的扩大和技术实力的提升,以更好地满足用户需求并推动AI工具的发展。同时,说明团队对AI工具发展的看法,例如对于更智能化、更易用性和更广泛应用的期望,以及对于推动AI技术在各个领域的应用和发展的愿景。这可以让用户了解Bito团队的发展方向和愿景,增加用户对工具未来的期待和信心。 七、总结 综上所述,我们对Bito工具进行了全面的介绍和总结: 1. 工具概述:简要介绍了Bito工具的功能和用途,如数据预处理、模型训练和评估等。 2. 工具特点和优势:列举并详细说明了Bito工具的特点和优势,如易用性、灵活性、自动化能力和可扩展性等。 3. 支持的功能和算法:列举了Bito工具支持的功能和算法,如特征选择、分类、回归和聚类等,并举例说明了其应用场景。 4. 使用指南和示例:提供了使用Bito工具的指南和示例,包括数据准备、模型训练和结果评估的步骤和方法。 5. 文档和支持资源:介绍了Bito工具的文档和支持资源,如用户手册、API文档和在线支持论坛等,以帮助用户更好地使用工具。 6. 工具的限制和局限性:列举了Bito工具目前存在的一些限制和局限性,如处理大规模数据的能力、特定算法的支持等。 7. 可能的问题和挑战:讨论了使用Bito工具可能遇到的问题和挑战,并提供了解决方案或建议。 8. 目前用户反馈和改进计划:引用了来自用户的反馈,并提及Bito团队正在进行的改进计划,以展示工具的实际使用情况和改进方向。 9. 可能的增强功能和新特性:展望了Bito工具未来可能的增强功能和新特性,如更多的预训练模型、更强大的分布式计算能力等。 10. 预期的技术进步和应用领域:探讨了AI技术的发展趋势,并说明了Bito工具在不同领域中的应用前景。 11. 开发团队的发展计划和愿景:介绍了Bito团队的发展计划和愿景,以及他们对AI工具发展的看法。 推荐使用!
查看详情点赞1评论1收藏1浏览642023-06-28 11:38:25Linux Centos7 安装composer
centos下composer两种安装办法,一般用第一种就可以了。第一种#下载composer.phar文件 curl -sS https://getcomposer.org/installer | php #将composer.phar移动到环境变量中并且更名为composer mv composer.phar /usr/local/bin/composer #使用国内镜像 composer config -g repo.packagist composer https://packagist.phpcomposer.com #查看版本 composer --version第二种wget https://dl.laravel-china.org/composer.phar -O /usr/local/bin/composer chmod a x /usr/local/bin/composer
查看详情点赞1评论收藏浏览482023-06-28 09:17:50