最近业余时间在维护一个rss聚合应用,就发现很多网站feed的条目摘要存在各种问题,用strip_tags一刀切吧,对摘要的段落和样式扭曲了 例如:有一些网站的摘要是截断输出,例如指定的摘要长度截断,这样会导致摘要中出现非闭合的html标签,下面的摘要是一个例子: $str=<<<EOF <P> 【手机中国 导购】时间过得真快,转眼就我们就已经度过了2013年的上半年,而我们也悄无声息地老了半岁。不过随着时间的流逝,手机行业也在快速的进步着,其发展速度之快可以用日新月异来形容了。</P> <P align=center><IMG style=”BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-RIGHT: black 1px solid” alt=”2.2GHz骁龙800四核 上半年热门机N宗最 ” align=1 src=”http://imgm.cnmo.com/cnmo_product/18_500x375/698/ceFYnyzZgUijQ.jpg”><BR>2012年的旗舰机型HTC Butterfly</P> <P> 回首2012年,手机市场还处于一个相对比较矛盾的时期,国产手机的初露锋芒以及国际大牌的推陈出新,让消费者有些摸不清头脑。到了2013年之后,虽然这个现象还存在着,唯一不同的就是消费者已经逐渐习惯了这个现状,整个手机行业也是在不断的向前进。</P> <P> 毫不夸张的说,今天刚刚上市了一款各个方面都表现突出的机皇级旗舰机,也许明天就被其他品牌旗舰所取代,这是一个不争的事实。但相比来说,每个品牌每款旗舰也都有自己的特长,比如处理器主频高或是屏幕尺寸大等等。</P> <P align=center><IMG style=”BORDER-BOTTOM: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-TOP: […]
一、打印方法: 一般打印web使用的是window.print()方法,当然也可使用vue-print 二、参数介绍: @page中一般设置打印的页头页脚打印方向等,示例: size:打印信息,打印纸张类型(A4)亦或控制打印方向,portrait: 纵向打印地, landscape: 横向。 @page{ } @media print 设置css中可以查看打印样式,示例: media print { } 可以将打印和页面的部分分离,需要注意的是需要打印的部分用“包含css样式再赋予函数,注意不是引号。然后抛出引入展示页面中,放在data的return {}下就行了。 三、分页: 分页的话使用的css样式一般是page-break-before与page-break-after这两个,对应的是打印前分页与打印后分页。 page-break-before 在元素前分页 page-break-after 在元素后分页 page-break-inside 元素内部分页 打印属性可以控制分页方向,可以设定4种设定值:auto、always、left和right。其中Auto是默认值,只有在有需要时,才需设定分页符号,以page-break-after示例: page-break-after:auto; 默认值 page-break-after:always; 新分页在元素下方 page-break-after:left; 新分页在元素下方 page-break-after:right; 新分页在元素下方 注意: 1.分页的元素必须是个可展示的块级元素,为求保险最好加上display: block; 2.元素内分页我试过,不怎么管用,所有还是用page-break-after比较好,要循环中分页的建议加个判断,然后再设置分页,再添加新的table元素,在该table元素中复制这个循环同样加上判断展示分页后的内容 3.建议分页元素放在两个table元素之间,分页后的table元素设置margin-top,如果不起左右就在元素属性style上设置 ———————————————— […]
相信大家在看正则表达式语法的时候都会遇到下面几种:正向肯定,正向否定,反向肯定,反向否定 1、(?=pattern) 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。 这是一个非获取匹配,该匹配不需要获取供以后使用。 例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”, 但不能匹配“Windows3.1”中的“Windows”。 预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索, 而不是从包含预查的字符之后开始。 2、(?!pattern) 正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。 这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。 例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”, 但不能匹配“Windows2000”中的“Windows”。 3、(?<=pattern) 反向肯定预查,与正向肯定预查类似,只是方向相反。 例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”, 但不能匹配“3.1Windows”中的“Windows”。 4、(?<!pattern) 反向否定预查,与正向否定预查类似,只是方向相反。 例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”, 但不能匹配“2000Windows”中的“Windows”。 我第一次看的时候就觉得很难理解,读了两遍好不容易理解了,但是一直用不上,直到工作需要…………… str = “111/;hkakdhaldladhl;gddhkshls;hhhh” 用 ; 切割字符串,要求切割结果是111/;hkakdhaldladhl gddhkshls hhhh,也就是第一个;前面有/,所以第一个;不分割,只分割后面的; 这其实就用到了反向否定,将python里面的split函数和正则表达式完美结合在一起,大家根据我的例子再去理解正(反)向否(肯)定匹配,肯定就更清晰了 python代码实现: import re str = “111/;hkakdhaldladhl;gddhkshls;hhhh” str_list = re.split(r”(?<!\/);”,str) print(str_list) 结果: […]
下载 从https://curl.haxx.se/ca/cacert.pem下载最新的cacert.pem 配置 php.ini配置找到curl.cainfo ,注释删除, 重启动
本文转自:https://www.yiichina.com/tutorial/1405 官方文档:http://www.yiichina.com/doc/guide/2.0/db-query-builder 文章涉及where、 addParams 、filterWhere 、andWhere、orWhere、 andFilterWhere()、 orFilterWhere()、andFilterCompare()但是格式是一样的 字符串和哈希格式很好理解,我们来看看操作符格式,因为操作符格式可以组成相对复杂的查询语句最简单的就是官方给的例子 操作符格式 第一个参数是操作符操作符包括and、or、 like、in、 between等第二个第三个都是操作数 $query->andWhere(new Expression(‘FIND_IN_SET(‘1,size’)’));+生成的语句… WHERE id=1 AND FIND_IN_SET(1, size)//size的值:1,2,3,4,5
文章一般都有统计浏览次数的需求,一般小型项目的做法就是直接 update 数据库中的某个字段。在 Yii 中怎么实现呢?请往下看: 实现 方式一 Yii2 中有这个 updateAllCounters 静态方法,这种方式是最快并且最省事的实现方式,代码示例如下: 如果你的条件比较复杂你可以这样写: 如果你现在的需求是:更新一个字段的值,一个字段的值 +1,你可以试着用这种方式去实现: PS:此处的 view_count 字段默认值切记不能设置为 null。 Expression 是表达式的意思,可以实现更多特殊 SQL,想了解更多,可以去搜索一下文档。 方式二 当然你还可以这样去实现:
今天调试yii2自带的swift mailer发邮件,开始调试时,发送用的send()方法始终返回true,但是就是没有收到邮件,很是纳闷,于是开始了半个晚上的调试之旅,我把调试过程发出来,希望后面的小伙伴能少走一些弯路。首先,根据热心网友的文章,配置邮箱的基础信息,我用的base项目,所以我的配置文件是web.php,配置内容为: ‘mailer’ => [ ‘class’ => ‘yii\swiftmailer\Mailer’, ‘transport’ => [ ‘class’ => ‘Swift_SmtpTransport’, ‘host’ […]
打开 php 的 openssl 扩展。 浏览器访问:getcomposer.org/installer, 进入安装程序。 安装完后,composer -v 查看版本。 换镜像: composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
Powerful Modern Math Library for PHP MathPHP is the only library you need to integrate mathematical functions into your applications. It is a self-contained library in pure PHP with no external dependencies. It is actively under development with development (0.y.z) releases. Features […]
EasyTask是PHP常驻内存定时器Composer包,定位与Javascript的setInterval定时器效果一致,您可以用它来完成需要重复运行的任务(如订单超时自动取消,短信邮件异步推送,队列/消费者/频道订阅者等等),甚至处理Crontab计划任务(如每天凌晨1点-3点同步DB数据,每月1号生成月度统一报表,每晚10点重启nginx服务器等等);内置任务异常上报功能,异常错误您都可以自定义处理(例如实现异常错误自动短信邮件通知);还支持任务异常退出自动重启功能,让您的任务运行更稳定 ,工具包同时支持windows、linux、mac环境运行。 运行环境 windows:PHP>=5.4 (依赖com_dotnet+wpc扩展)文档+安装教程 linux|mac:PHP>=5.4 (依赖pcntl+posix扩展)文档+安装教程 Composer安装 composer require easy-task/easy-task 【一】. 快速入门->创建任务 //初始化 $task = new Task(); // 设置非常驻内存 $task->setDaemon(false); // 设置项目名称 $task->setPrefix(‘EasyTask’); // 设置记录运行时目录(日志或缓存目录) $task->setRunTimePath(‘./Application/Runtime/’); // 1.添加闭包函数类型定时任务(开启2个进程,每隔10秒执行1次你写闭包方法中的代码) $task->addFunc(function () { $url = ‘https://www.gaojiufeng.cn/?id=243’; @file_get_contents($url); }, ‘request’, 10, 2); // 2.添加类的方法类型定时任务(同时支持静态方法)(开启1个进程,每隔20秒执行一次你设置的类的方法) […]