PHP 时间处理类Carbon的常见用法
Carbon是php中对时间的一个封装。在内部通过使用DateTime实现了很多简单的方法。比如Carbon::now来说,使用echo Carbon::now()->toDateTimeString()可以直接获取到当前时间。使用DateTime你可能会需要echo (new DateTime())->format('xxxxx')包括其他对时间的操作,增加、减少天/秒/分/月,时间比较等等。 // 获取当前时间 echo Carbon::now(); // 2022-07-04 17:37:18 // 获取当前时间戳 echo Carbon::now()->timestamp; // 时间戳格式化 echo Carbon::now()->timestamp(1656928928)->toDateTimeString(); // 2022-07-04 18:02:08 echo Carbon::now()->timestamp(1656928928)->toDateString(); // 2022-07-04 // 昨天 echo Carbon::yesterday(); // 2022-07-03 00:00:00 // 今天 echo Carbon::today(); // 22022-07-04 00:00:00 // 明天 echo Carbon::tomorrow(); // 2022-07-05 00:00:00 // 获取当前时间的固定格式 echo Carbon::now()->format('Y-m-d'); // 2022-07-04 // 获取当前时间是几号 echo Carbon::now()->day; // 4号 // 获取当前时间是第几月 echo Carbon::now()->month; // 7月 // 获取今年年分 echo Carbon::now()->year; // 2022年 // 获取当前时间的小时 echo Carbon::now()->hour; // 17点 // 获取当前时间的分钟 echo Carbon::now()->minute; // 50分 // 将carbon对象转换成string类型 echo Carbon::now()->toDateTimeString(); // 2022-07-04 17:59:05 echo Carbon::now()->toDateString(); // 2022-07-04 echo Carbon::now()->toFormattedDateString(); // Jul 4, 2022 echo Carbon::now()->toTimeString(); // 18:00:37 echo Carbon::now()->toDayDateTimeString(); // Mon, Jul 4, 2022 6:01 PM // 获取前一天的开始时间 echo Carbon::now()->yesterday()->startOfDay(); // 2022-07-03 00:00:00 // 获取前一天的结束时间 echo Carbon::now()->yesterday()->endOfDay(); // 22022-07-03 23:59:59 // 上一周开始时间 (星期一) echo Carbon::now()->previous()->startOfWeek(); // 2022-06-27 00:00:00 // 上一周结束时间 (星期天) echo Carbon::now()->previous()->endOfWeek(); // 2022-07-03 23:59:59 // 获取这周开始时间 echo Carbon::now()->startOfWeek(); // 2022-07-04 00:00:00 // 获取这周开始时间 echo Carbon::now()->endOfWeek(); // 2022-07-10 23:59:59 // 获取上一月的开始时间 echo Carbon::now()->subMonth(1)->startOfMonth(); // 2022-06-01 00:00:00 // 获取上一月的结束时间 echo Carbon::now()->subMonth(1)->endOfMonth(); // 2022-06-30 23:59:59 // 这个月的第一天开始时间 echo Carbon::now()->startOfMonth(); // 2022-07-01 00:00:00 // 这个月的最后一天结束时间 echo Carbon::now()->endOfMonth(); // 2022-07-31 23:59:59 // 获取上一年的开始时间 echo Carbon::now()->subYear(1)->startOfYear(); // 2021-01-01 00:00:00 // 获取上一年的结束时间 echo Carbon::now()->subYear(1)->endOfYear(); // 2021-12-31 23:59:59 // 今年开始时间 echo Carbon::now()->startOfYear(); // 2022-01-01 00:00:00 // 今年结束时间 echo Carbon::now()->endOfYear(); // 2022-12-31 23:59:59 // 获取今天是当年的第多少天 echo Carbon::now()->dayOfYear; // 185 // 获取今天是这个月的第几周 echo Carbon::now()->weekOfMonth; // 1 // 获取今天是当年的第多少周 echo Carbon::now()->weekOfYear; // 27 // 获取今天是当前的第几季度 echo Carbon::now()->quarter; // 3 // 获取当月天数 echo Carbon::now()->daysInMonth; // 31 // 根据日期计算年龄 echo Carbon::createFromDate(1995, 1, 1)->age; // 27
查看详情点赞1评论收藏1浏览462023-03-31 10:53:48phpStorm 安装及破解
phpStorm,这是一款功能十分强大的专业编程工具软件,而这次小编为大家分享的版本是PhpStorm系列中最新的一个版本,而且经过了汉化破解,界面完全显示中文界面,软件本身是完美的支持xml、json、html、css、JavaScrip等系列的代码的,可以进行一系列的编程工作~一、进入官网,下载最新版软件下载地址: https://www.jetbrains.com/phpstorm/1、下载本站提供的压缩包,得到jetbrains phpstorm 2023原程序,双击它开始安装。2、选择软件安装位置,点击Browser可自行更换安装路径。3、选择附加任务,自行选择需要的进行勾选。4、选择开始菜单文件夹,默认即可。5、正在安装中,请耐心等待一会。6、安装成功,点击Finish退出软件安装向导。二、破解百度搜索phpStorm最新版注册码,见下面博主链接,亲测可用。我用的是2023版,最新获取激活码如下,不行再根据下面链接重新获取(不是打广告,只是正好搜索可以用)FDXL1Y2811-eyJsaWNlbnNlSWQiOiJGRFhMMVkyODExIiwibGljZW5zZWVOYW1lIjoiQmVub2l0IE1lbmVuZGV6IiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6IiIsImNoZWNrQ29uY3VycmVudFVzZSI6ZmFsc2UsInByb2R1Y3RzIjpbeyJjb2RlIjoiRFBOIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0yNyIsInBhaWRVcFRvIjoiMjAyNC0wMy0yNiIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiREIiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAzLTI3IiwicGFpZFVwVG8iOiIyMDI0LTAzLTI2IiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJQUyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMjciLCJwYWlkVXBUbyI6IjIwMjQtMDMtMjYiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IklJIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0yNyIsInBhaWRVcFRvIjoiMjAyNC0wMy0yNiIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUlNDIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0yNyIsInBhaWRVcFRvIjoiMjAyNC0wMy0yNiIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJHTyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMjciLCJwYWlkVXBUbyI6IjIwMjQtMDMtMjYiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IkRNIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0yNyIsInBhaWRVcFRvIjoiMjAyNC0wMy0yNiIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUlNGIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0yNyIsInBhaWRVcFRvIjoiMjAyNC0wMy0yNiIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJEUyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMjciLCJwYWlkVXBUbyI6IjIwMjQtMDMtMjYiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlBDIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0yNyIsInBhaWRVcFRvIjoiMjAyNC0wMy0yNiIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUkMiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAzLTI3IiwicGFpZFVwVG8iOiIyMDI0LTAzLTI2IiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJDTCIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMjciLCJwYWlkVXBUbyI6IjIwMjQtMDMtMjYiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IldTIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0yNyIsInBhaWRVcFRvIjoiMjAyNC0wMy0yNiIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUkQiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAzLTI3IiwicGFpZFVwVG8iOiIyMDI0LTAzLTI2IiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSUzAiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAzLTI3IiwicGFpZFVwVG8iOiIyMDI0LTAzLTI2IiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSTSIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMjciLCJwYWlkVXBUbyI6IjIwMjQtMDMtMjYiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IkFDIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0xMi0zMSIsInBhaWRVcFRvIjoiMjAyNC0wMy0yNiIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUlNWIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0yNyIsInBhaWRVcFRvIjoiMjAyNC0wMy0yNiIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJEQyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMjciLCJwYWlkVXBUbyI6IjIwMjQtMDMtMjYiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlJTVSIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMjciLCJwYWlkVXBUbyI6IjIwMjQtMDMtMjYiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IkRQIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0yNyIsInBhaWRVcFRvIjoiMjAyNC0wMy0yNiIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQREIiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAzLTI3IiwicGFpZFVwVG8iOiIyMDI0LTAzLTI2IiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBXUyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMTItMzEiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMjYiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUFNJIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0xMi0zMSIsInBhaWRVcFRvIjoiMjAyNC0wMy0yNiIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQUFMiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAzLTI3IiwicGFpZFVwVG8iOiIyMDI0LTAzLTI2IiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBDV01QIiwicGFpZFVwVG8iOiIyMDI0LTAzLTI2IiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBHTyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMjciLCJwYWlkVXBUbyI6IjIwMjQtMDMtMjYiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUFBDIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0yNyIsInBhaWRVcFRvIjoiMjAyNC0wMy0yNiIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQUkIiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAzLTI3IiwicGFpZFVwVG8iOiIyMDI0LTAzLTI2IiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBTVyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMTItMzEiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMjYiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUlMiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAzLTI3IiwicGFpZFVwVG8iOiIyMDI0LTAzLTI2IiwiZXh0ZW5kZWQi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破解方法转载: https://www.ajihuo.com/php/4962.html
查看详情点赞1评论收藏1浏览1372023-05-04 14:55:28PHP 页面静态化处理,生成静态页面!
做SEO的都知道,最好是把我们的网站页面生成静态页面,好处就太多了。下面我们直接搞!首先我们在一个公共的服务层,封装一个生成静态页面的方法/** * 生成静态页面 * @param string $filePath * @param string $htmlStr */ public static function generateStaticPage(string $filePath, string $htmlStr) { switch ($filePath) { case "index" || "/": return file_put_contents('index.html',$htmlStr); default: //自定义页面 $dir = iconv("UTF-8", "GBK", $filePath); $path = str_replace("/","\\",public_path($dir)); if (!file_exists($path)) mkdir($dir,0777,true); return file_put_contents('./'.$filePath.'/index.html',$htmlStr); } }然后调用://生成静态页 $res = CommonService::generateStaticPage($routeMaps->route,$indexHtmlStr); if (!empty($res) || $res != 0){ dump("页面生成成功"); } return view("index");这样就可以生成我们的网页了,但是有个问题,这种只是针对那种单页面,对于有数据渲染和功能交互的页面就不行了,所以我们要在进行View页面交互后生成静态页然后放入html中,如下:下面以Laravel为例:$news= News::get(); $string = view('news.news',compact("news"))->__toString(); file_put_contents("index.html", $string);现在基本上就差不多了。
查看详情点赞1评论收藏1浏览592023-05-18 11:45:03phpquery 使用方法
最近在做静态页生成项目中,需要先对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评论收藏浏览1682023-07-26 14:09:39PHP 处理无限极分类数据通用方法
在工作中,我们经常会遇到处理多级分类的问题,我们常见的是三级,定义一个字段pid,查询的时候一级一级查询数据数据,这样也是可以解决问题。只是不够灵活,所以就有了无限极,不管有多少级菜单都能很好的快速处理。下面是PHP中无限极分类的处理方法:/** * 处理无限极分类通用方法 */ public function tree($list=[], $pk='id', $pid = 'pid', $child = '_child', $root = 0): array { // 创建Tree $tree = array(); if(is_array($list)) { // 创建基于主键的数组引用 $refer = array(); foreach ($list as $key => $data) { $refer[$data[$pk]] =& $list[$key]; } foreach ($list as $key => $data) { // 判断是否存在parent $parentId = $data[$pid]; if ($root == $parentId) { $tree[] =& $list[$key]; }else{ if (isset($refer[$parentId])) { $parent =& $refer[$parentId]; $parent[$child][] =& $list[$key]; } } } } return $tree; }$list:是直接读取数据库数据。给这个方法处理
查看详情点赞1评论收藏浏览1222023-08-11 10:01:52php 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收藏浏览1252023-07-11 11:50:15PHP 利用ZipArchive类库实现压缩&解压文件夹
最近有一个小的功能需求,就是需要通过访问接口根据token访问或下载远程的资源压缩包,所以需要实现资源文件夹的压缩及解压,用了很多库最后发现这个类库是比较方便的。zip文件夹压缩/** * 压缩文件夹 */ public function createZipFile(){ $folderPath = public_path("target"); $zipFilePath = public_path().'/target.zip'; $zip = new ZipArchive(); if ($zip->open($zipFilePath, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) { // 递归添加文件夹下的所有文件和子文件夹 $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($folderPath), RecursiveIteratorIterator::LEAVES_ONLY ); foreach ($files as $name => $file) { if (!$file->isDir()) { $filePath = $file->getRealPath(); $relativePath = substr($filePath, strlen($folderPath) + 1); $zip->addFile($filePath, $relativePath); } } $zip->close(); echo '文件夹压缩成功'; } else { echo '无法打开或创建压缩文件'; } }解压zip压缩包 /** * 网站html解压 * @param $url * @return string */ public function websiteHtmlHandle($url) { $pathInfo = pathinfo($url); $extension = $pathInfo['extension']; //只允许解压zip格式文件 if (in_array($extension, ["zip"])) { try { $targetFile = $this->downLoadFile($url); $zip = new ZipArchive(); if ($zip->open($targetFile) === TRUE) { $outputFolder = public_path(); if (!is_dir($outputFolder)) { mkdir($outputFolder, 0777, true); } // 解压缩文件,保留原文件结构 $zip->extractTo($outputFolder); $zip->close(); $this->deleteDirectory($targetFile); } else { return $this->error('解压失败!'); // 处理打开压缩文件失败的情况 } } catch (\Exception $e) { return $this->error($e->getMessage()); } }else{ return $this->error('不允许解压改格式压缩包!'); } return $this->success(); }看看操作结果:功能没问题。
查看详情点赞评论收藏浏览502024-05-14 11:20:37PHP中的HTTP请求(GET请求,POST请求),及response响应返回
不说了,直接记录代码,下次直接用。get请求:/** * GET请求 * @param $url * @return mixed */ public function curlGet($url){ $ch1 = curl_init(); $timeout = 0; curl_setopt($ch1, CURLOPT_URL, $url); curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch1, CURLOPT_ENCODING, ''); curl_setopt($ch1, CURLOPT_MAXREDIRS, 10); curl_setopt($ch1, CURLOPT_HTTPHEADER, array()); curl_setopt($ch1, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($ch1, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch1, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch1, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch1, CURLOPT_CUSTOMREQUEST, "GET"); curl_setopt($ch1, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); $access_txt = curl_exec($ch1); curl_close($ch1); return json_decode($access_txt, true); }post请求:/** * 发送http post请求 * @param $url * @param $data * @param array $header * @param bool $is_json * @return mixed|string */ function httpPost($url, $data, $header = [],$is_json = true) { if (empty($header)) { $header = array( "Accept: application/json", "Content-Type:application/json;charset=utf-8", ); } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $res = curl_exec($ch); if (curl_errno($ch)) { $error_message = curl_error($ch); @file_put_contents(storage_path('logs/error.log'), var_export($error_message, true) . PHP_EOL, FILE_APPEND); } curl_close($ch); if($is_json){ return json_decode($res, true); } return trim($res); }response响应返回(记录日常用的下次直接用了):/** * 响应 * @param null $msg * @param int $code * @param array $data * @param int $result_code * @param string $type * @return void */ public function response($msg = null,$code = self::SUCCESS,$data = [],$result_code = 200,$type = 'application/json') { $result = [ 'msg' => $msg, 'code' => $code, 'data' => $data, ]; $this->header['Content-Type'] = $type; $response = response($result,$result_code,$this->header); throw new HttpResponseException($response); } /** * @param array $data * @param string $message * @param int $status * @return string */ protected function success($data = [], $message = 'success', $status = 200) { $array = compact('status', 'message', 'data'); return json_encode($array, JSON_UNESCAPED_UNICODE); } /** * @param int $status * @param string $message * @param array $data * @return string */ protected function error($message = 'error', $status = 400, $data = []) { $array = compact('status', 'message', 'data'); return json_encode($array, JSON_UNESCAPED_UNICODE); }
查看详情点赞评论收藏浏览502024-05-20 12:05:27