php获取html内的纯文本

在写xml的时候,文档要求内容里面只要图片和段落就可以了,其他的css,js什么的都不需要。

所以,在输出的时候,就要用正则去过滤掉不需要的标签代码。

第一种:php正则去除js标签代码。

$preg = "/<script[\s\S]*?<\/script>/i";
$content = preg_replace($preg, "", $content);

第二种:php正则去除meta标签

$preg = "/<meta[\s\S]*?>/i";
$content = preg_replace($preg, "", $content);

第三种:php正则去除link标签

$preg = "/<link[\s\S]*?>/i";
$content = preg_replace($preg, "", $content);

第四种:php正则去除页内css样式

$preg = "/<style[\s\S]*?<\/style>/i";
$content = preg_replace($preg, "", $content);

第五种:php正则去除行内样式,id,class等

$preg = "/(style|id|class)=\"[\s\S]*?\"/i";
$content = preg_replace($preg, "", $content);

其他的标签可以自行脑补。

 

 

<pre>function getClearStr($str){
//去掉中,英文标点符号和HTML代码
    $str = preg_replace( "/<style[\s\S]*?<\/style>/i", "", $str );
    $str = preg_replace( "/<script[\s\S]*?<\/script>/i", "", $str );
    $str=preg_replace('/\s/','',preg_replace("/[[:punct:]]/",'',strip_tags(html_entity_decode($str,ENT_QUOTES,'UTF-8'))));

    return $str;
}</pre>

令人困惑的strtotime

经常会有人被strtotime结合-1 month, +1 month, next month的时候搞得很困惑, 然后就会觉得这个函数有点不那么靠谱, 动不动就出问题. 用的时候就会很慌…

这不, 刚刚就有人在微博上又问我:

鸟哥,今天是2018-07-31 执行代码:

  1. date(“Y-m-d”,strtotime(“-1 month”))

怎么输出是2018-07-01?

好的吧, 虽然这个问题看起来很迷惑, 但从内部逻辑上来说呢, 其实是”对”的, 你先别着急哈, 让我慢慢讲:

我们来模拟下date内部的对于这种事情的处理逻辑:

  • 1. 先做-1 month, 那么当前是07-31, 减去一以后就是06-31.
  • 2. 再做日期规范化, 因为6月没有31号, 所以就好像2点60等于3点一样, 6月31就等于了7月1

是不是逻辑很”清晰”呢? 我们也可以手动验证第二个步骤, 比如:

  1. var_dump(date(“Y-m-d”, strtotime(“2017-06-31”)));
  2. //输出2017-07-01

也就是说, 只要涉及到大小月的最后一天, 都可能会有这个迷惑, 我们也可以很轻松的验证类似的其他月份, 印证这个结论:

  1. var_dump(date(“Y-m-d”, strtotime(“-1 month”, strtotime(“2017-03-31”))));
  2. //输出2017-03-03
  3. var_dump(date(“Y-m-d”, strtotime(“+1 month”, strtotime(“2017-08-31”))));
  4. //输出2017-10-01
  5. var_dump(date(“Y-m-d”, strtotime(“next month”, strtotime(“2017-01-31”))));
  6. //输出2017-03-03
  7. var_dump(date(“Y-m-d”, strtotime(“last month”, strtotime(“2017-03-31”))));
  8. //输出2017-03-03

那怎么办呢?

从PHP5.3开始呢, date新增了一系列修正短语, 来明确这个问题, 那就是”first day of” 和 “last day of”, 也就是你可以限定好不要让date自动”规范化”:

  1. var_dump(date(“Y-m-d”, strtotime(“last day of -1 month”, strtotime(“2017-03-31”))));
  2. //输出2017-02-28
  3. var_dump(date(“Y-m-d”, strtotime(“first day of +1 month”, strtotime(“2017-08-31”))));
  4. ////输出2017-09-01
  5. var_dump(date(“Y-m-d”, strtotime(“first day of next month”, strtotime(“2017-01-31”))));
  6. ////输出2017-02-01
  7. var_dump(date(“Y-m-d”, strtotime(“last day of last month”, strtotime(“2017-03-31”))));
  8. ////输出2017-02-28

那如果是5.3之前的版本(还有人用么?), 你可以使用mktime之类的, 把所有的日子忽略掉, 比如都限定为每月1号就可以了, 只不过就不如直接用first day来的更加优雅.

现在, 搞清楚了内部原理, 是不是就不慌了? 🙂

PHP Session锁及并发机制 | void session_write_close(void)函数

手册中有这样的描述:
void session_write_close ( void )

End the current session and store session data.

Session data is usually stored after your script terminated without the need to call session_write_close(), but as session data is locked to prevent concurrent writes only one script may operate on a session at any time. When using framesets together with sessions you will experience the frames loading one by one due to this locking. You can reduce the time needed to load all the frames by ending the session as soon as all changes to session variables are done.

也就是说session是有锁的,为防止并发的写会话数据,php自带的的文件保存会话数据是加了一个互斥锁(在session_start()的时候)。
程序执行session_start(),此时当前程序就开始持有锁。
程序结束,此时程序自动释放Session的锁。

如果同一个客户端同时并发发送多个请求(如ajax在页面同时发送多个请求),且脚本执行时间较长,就会导致session文件阻塞,影响性能。因为对于每个请求,PHP执行session_start(),就会取得文件独占锁,只有在该请求处理结束后,才会释放独占锁。这样,同时多个请求就会引起阻塞。解决方案如下:
修改会话变量后,立即使用session_write_close()来保存会话数据并释放文件锁。

session_start();   
$_SESSION['test'] = 'test';
session_write_close();
......
//do something

php 获取当前浏览器语言 EN CN

/*获取客户端语言设置到session*/
public function clientLang()
{
    $languageValue = Yii::$app->session->get('language');
    if (!isset($languageValue))
    {
        //只取前4位,这样只判断最优先的语言。如果取前5位,可能出现en,zh的情况,影响判断。
        $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 4);
        if (preg_match("/zh-c/i", $lang)||preg_match("/zh/i", $lang))
            Yii::$app->session['language'] ='CN';
        else
            Yii::$app->session['language'] ='EN';
    }


}

Composer实现PHP中类的自动加载

本篇博客承接上一篇,学习一下Composer实现的PHP的类的自动加载方式。首先说明一下,Composer是PHP针对PHP语言的第三方的依赖管理工具,将工程所用到的依赖文件包含在composer.json文件中,使用composer install命令就可以将所使用对应库或者文件加载进工程里面。下面分两部分介绍composer的基础,分别是composer的依赖管理和自动加载。

依赖管理

在composer出现之前,如果咋PHP项目中需要第三方的依赖文件,则需要程序员将所需要的源代码拷贝进工程中或者将源代码对应的文件下载下来手动添加到工程中。如果所需要的依赖文件依赖于更多的第三方文件,则程序员会陷入拷贝依赖文件的黑洞中,费时费力不说,有可能还会出现一些失误,composer就是在这种情况下出现的用于减轻程序员的对于依赖管理的负担的工具。

Composer通过使用配置文件composer.json文件完成依赖管理。composer.json文件包含了项目的简单介绍、项目对于外界的库或文件的依赖。从composer.json的扩展名就可以看得出来,composer.json中的内容是按照json标准组织的。本篇博客集中在类的自动加载机制上,因此对于composer.json中关于项目的作者等相关信息的解释忽略不解释。

在composer中将本项目所需要的外部依赖包写在关键字require对应的值中,require键可以对应着多个所需要的包,各个不同的包之间用逗号分隔。假设项目需要一个外部依赖包monolog,下面是在compose.json文件中对于monolog包的依赖配置项:

1
2
3
4
5
{
    "require":{
        "monolog/monolog": "1.0.* @dev"
    }
}

如上所示,require关键字将会映射包的名称monolog和包的版本1.0.*。其中,包的名称有两部分组成,中间以“/”分隔,“/”之前代表的包的所有者,在Github上一般是代表的Github的用户名,“/”代表的是实际的包的名称。其中“/”之前的名称必须是唯一的,但是”/”之后的包的名称是可以存在重复的,例如“Jack/monolog”和“monolog/monolog”是可以共存的。而后面的”1.0.*”代表的是所依赖的包的版本,其中“*”代表的是“1.0”之下的任意一个版本,例如:1.0.1,1.0.2或者1.0.9等等。“@dev”代表了可以获取该包的开发版本。默认情况下,composer将获取所需要的包的最新的稳定版本,而不会考虑开发版本,因为开发版本一般是不太稳定的版本。但是,如果确定开发版本没有什么问题就可以加上“@dev”以允许获取开发的版本。如果没有加上“@dev”,而除了开发版本之外不存在别的版本的话,则composer加载依赖项出错。

在composer中配置好依赖的第三方的包之后,就可以使用composer install命令获取第三方的包了。运行成功之后就可以项目中就会出现vendor文件夹,vendor文件夹中会包含我们在require中所列出的monolog文件。

出了生成列在composer.json中关键字require值下的文件之外,成功运行composer install之后还会生成对应的composer.lock文件,该文件依据composer.json中的依赖项生成依赖包对应的版本。这里需要说明的是,在我们运行composer install的时候会首先判断是否存在着composer.lock文件。如果原本就存在这composer.lock文件,那么就会直接根据composer.lock中的版本下载对应的包,此时不再理会composer.json中的配置项。如果不存在composer.lock文件,则根据composer.json文件中的配置下载对应的版本,并生成composer.json对应的composer.lock文件。composer.lock又称为锁定文件,生成对应的composer.lock之后,composer.json和composer.lock共同对版本进行控制。有了composer.lock之后,及时有了新的版本也不会触发新版本的更新,除非手动使用composer update命令进行手动的更新。

开发环境下的依赖

  有的时候我们只是在开发的时候才会依赖于某个具体的包,但是在发行的版本中并不需要这样的包,为了达到这种要求可以使用require-dev引入开发环境下的包依赖。如下:

1
2
3
4
5
{
    "require-dev":{
        "xxxx/xxxx": "x.x.* @dev"
    }
}

自动加载类

通过composer.json或者composer.lock,所依赖的第三方库已经被下载下来了,那么在我们的项目中怎么使用这些第三方库呢?最简单的方式就是通过include或者require将所需要的类文件包含进来,但是这种方式需要我们自己去寻找所使用的类对应的类文件,这就存在和PHP语言中直接使用include和require加载所需要的类存在同样的弊端,一种比较简单的方式当然就是使用composer提供的类的自动加载机制了。类似于PHP的自动加载机制,composer提供了autoload实现类的自动加载。

成功运行composer install之后,只要调用生成的vendor目录下的autoload.php文件就可以调用通过composer.json加载的类了。以上面所述的项目中需要monolog包为例,通过可以通过下面的方式使用monolog包中的Logger类。

1
2
include "vendor/autoload.php";
$log = new Monolog\Logger("name");

当然,除了使用第三方库中提供的类之外,还可以使用自己的定义的类。Composer提供了autoload关键字用于加载我们自己提供的类,假如我们定义了一个有关测试的类,如下:

1
2
3
4
5
6
7
class ClassTest{
    public function test()
    {
        echo "hello world!";
    }
}

将该类放在lib目录下的ClassTest.php文件夹下面,那么怎么让composer加载自己定义的类呢?

1. 在composer.json中加入autoload关键字

1
2
3
"autoload":{
    "files":["lib/ClassTest.php"];
}

files键对应的值是一个数组且改值是相对于文件应用根目录的文件的路径。在composer.json中加入上述的关键字之后,在命令行下运行composer dump-autoload就可以让composer重建加载信息,那么就可以在其他的文件中使用这个类了。

上述所述的方法和PHP中直接使用include和require存在一样的弊端,每个类都需要重新书写加载文件,费时费力。

2. composer.json中加入classmap关键字

相比于每个类文件都需要加载一次的做法,使用classmap关键字,能够减少程序员的负担,只需要将文件所在的目录添加在classmap的值中即可,如下:

1
"classmap" : ["lib"]

其实这需要建立一种类名到类所在的文件的映射关系。当需要相应的类的时候,composer通过类名找到对应的类文件名,将相应的类include进来。但是这同样存在一个问题就是,每增加一个类都需要重新运行一次composer dump-autoload重新创建类名到文件之间的映射关系,从而将对应的类加载进来。虽然比files关键字节省了功夫,但是依然不能完全自动加载所需要的类。

3. 基于PHP规范的自动加载方式

  针对PHP这种编程语言,到目前FIG指定了五个规范,分别如下:

  • PSR0:自动加载;
  • PSR1:基本代码规范;
  • PSR2:代码样式规范;
  • PSR3:日志接口规范;
  • PSR4:自动加载规范;

看上去PSR4与PSR0是重复了,但是PSR4规范比较干净,可以看成PSR0规范的升级版。二者最重要区别在于:PSR0规范中,下划线会被转换为目录分隔符,但是PSR4中下划线不具有特殊的含义。二者都是通过特定的目录、文件名以及类名,实现快速查找到类文件,并将相应的类加载进来。

PSR0和PSR4要求有个命名的空间,对上述的ClassTest类做相应的修改如下:

1
2
3
4
5
6
7
8
9
<?php
namespace ClassTestLib;
class ClassTest{
    public function test()
    {
        echo "hello world!";
    }
}

那么对应的文件的路径应该改为\lib\ClassTestLib\ClassTest.php,此时修改composer.json中的autoload如下:

1
2
3
4
5
"autoload":{
    "psr-0":{
        "ClassTestLib":"lib/"
    }  
}

可能你发现psr0的值有一些奇怪,是的。在这里ClassTestLib代表的是命名空间,而”lib”是目录名。加载对应的类文件的时候,搜索的路径是lib/ClassTestLib,而不是ClassTestLib/lib,这是在书写composer.json的时候需要注意的一点。

如果命名空间中存在着“\”,则在书写对应的composer.json的时候需要在相应的“\”再添加一个“\”。例如,如果命名空间改为ClassTest\Lib,相应的对应与应用根目录的路径名称应该变为\lib\ClassTest\Lib\ClassTest.php,对应的composer.json中的autoload应该变为:

1
2
3
4
5
"autoload":{
    "psr-0":{
        "ClassTest\\Lib":"lib/"
    }  
}

 

小结:以上是关于composer的基本使用方法,后续在遇到相关的问题,和大家在一起学习。

关于GMT和UTC时间? php 关于时区 date gmdate date_default_timezone_set/get 终极答疑

关于GMT和UTC时间?

GMT+0800
Greenwich: [gri:nitf], 格林威治/格林尼治.是英国伦敦泰晤士河附近的一个小镇
Mean: adj. 自私的; n. 平均..
he is mean about money.
GMT就是格林威治平均/标准时间

什么叫本初子午线?

国外叫 : prime mer’idian.只是在中国内才叫本初-子午线. 只是国内的翻译这样怪怪的.
prime 被国人翻译为本初,
meridian本意是 经线的/全盛的, 顶点的:
he is “at the meridian of ” life.
he was “at the meridian of ” his power then.
而在中国, 子为北方, 午为南方, 子午即南北方向, 所以就把经线 “南北线” 翻译成了子午线.
因此, 子午线只是中国的叫法, 国外没有 “子午” 这种天干地支的说法的.

经纬线都是假想 (imaginary)出来的线, 赤道是天然的纬线.经线从理论上来说, 任何连接南北两极的圆线都可以作为
prime meridian, 比如中国清朝的时候,还提出了自己的prime meridian. 因此, 需要从无数的子午线中 人为
地选出一条作为”首子午线”. 因为英国皇家天文台(Greenwich天文台)最先测量经线的长度, 所以把经过 Greenwich 天文台
子午仪中心的子午线作为经线的起点, 即0度子午线, 本初子午线.

Greenwich Village = the Village不是在英国, 而是在美国纽约.

GMT 又叫 UT0
经过 “地轴摆动”修正后的时间 叫 UT1, UT2
由铯原子钟提供的时间叫 “国际原子时” :TAI
那么, 把以上的所有时间: UT0, 1,2 TAI综合精确计算 提供的 “世界协调时” 就叫 UTC .
UTC与真的太阳时的误差在0.9秒内.否则, 要由巴黎…发布 “闰秒”.
UTC: universal time coordinated.

通常在程序中, php和javascript, jquery中, 就认为GMT和UTC是一样的, 没有区别的.

而CST, 则有 多义/歧义 解释了.
可以是 美国或澳大利亚的 Central Standard Time(中部标准时间)
也可以是 中国或古巴的标准时间: China/Cuba Standard Time
而在不同的语言中, 如php, java, 和 javascript中, 解释器/编译器对CST的理解不同, 而出错.

所以, 在编程中, 尽量少用 CST.

php和js/jquery中对时间/时区的操作?

  • 获得时间的函数:
php是 $dt = time()
js/jq 是 var dt = new Date();

// php中的time()时获得GMT时间戳的秒数. 是两个GMT时间的差 : 是指当前GMT英国Greenwich 0 时区的GMT时间
// 和unix纪元的 时间差.  跟php系统设置的 时区无关!
  • 也就是说, php的time()函数, 在某一时刻, 比如现在这一时刻, 在地球上的任何地方都是相同的. 因为他们都是返回的在伦敦的Greenwich的GMT时间.而不是本地时间, 所以跟php的系统设置时区无关.

  • 对日期/时间的操作
js获得new Date()对象后, 有丰富的成员函数来进行操作, 如getMonth, getDate, getDay, toString,UTC()等等
  • 对php的时间操作, 主要是date和gmdate的格式化问题
echo date("Y-m-d H:i:s"); 
// date() 返回的是: 当前(这一刻 time()函数执行/返回时) GMT标准时间 的"本地化时间" 的自定义格式时间
// date()跟php系统设置的时区有关!
echo gmdate("Y-m-d H:i:s");
// gmdate() 返回的是: 当前(这一刻 time()函数执行/返回时) GMT标准时间  的自定义格式时间
// gmdate() 跟你现在所处的位置无关, 跟php系统设置的时区无关!

也就说, date()和gmdate()的区别, 仅仅在于 处理的时间 是不同的!
  • strtotime(“str”)
strtotime("str"): 返回 string给定时间的 所对应的GMT标准时间的 unix时间戳,
如果当前php系统的设置的时区不是GMT标准时区,则在应用strtotime(string)时,系统会自动把时间
string折算成相应的GMT标准时间, 然后计算这个时间的unix时间戳。跟php系统设置的时区有关

关于时区

地球(地球和太阳在宇宙中的相对位置,和人类历史文化的原因)是自西向东自转,东边比西边先看到太阳,
东边的时间也比西边的早. 东边时刻与西边时刻的差值不仅要以时计,而且还要以分和秒来计算,
这给人们带来不便.

为了克服时间上的混乱, 1884年 在华盛顿召开的一次国际经度会议(又称国际子午线会议)上,
规定将全球划分为24个时区.它们是中时区(零时区)、东1-12区,西1-12区.
每个时区横跨经度15度,时间正好是1小时.最后的东、西第12区各跨经度7.5度,以东、西经180度为界.
每个时区的中央经线上的时间就是这个时区内统一采用的时间,称为区时.相邻两个时区的时间相差1小时.

例如,我国东8区的时间总比泰国东7区的时间快1小时,而比日本东9区的时间慢1小时.
因此,出国旅行的人,必须随时调整自己的手表,才能和当地时间相一致.
凡向西走,每过一个时区,就要把表向前拨1小时(比如2点拨到1点);凡向东走,每过一个时区,就要把表向后拨1小时
(比如1点拨到2点).

实际上,世界上不少国家和地区都不严格按时区来计算时间.为了在全国范围内采用统一的时间,
一般都把某一个时区的时间作为全国统一采用的时间.
例如,我国把首都北京所在的东8区的时间作为全国统一的时间,称为北京时间.
而实际上, 我国整个面积范围共跨了5个时区.
又例如,英国、法国、荷兰和比利时等国,虽地处中时区,但为了和欧洲大多数国家时间相一致,则采用东1区的时间.

如何设置php中的时区? 两种方法

  1. 如果可以修改服务器, 就在服务器中修改phh.ini文件:
[Date]
; Defines the default timezone used by the date functions
date.timezone = Asia/Shanghai 或者 Asia/Chongqing 或者 PRC
// 注意, 没有北京 Asia/Beijng
// 更注意的是, 如果phi.ini中没有[Date] date.timezone的话, 就要自己手动添加.
  1. 如果没有权限 不能 修改服务器上的php.ini, 就用函数方法
// 一般,最好在初始化 文件中 写
// 或调用时间函数之前, 写
ini_set('date.timezone', 'Asia/Shanghai 或者Asia/Chongqing 或者PRC');
ini_set('date.timezone', 'Etc/GMT-8'); // 后面是 -8 减8 , 这个Etc是linux中的/etc目录吗? 那最好不用?
date_default_timezone_set('Asia/Shanghai 或者Asia/Chongqing 或者PRC');
使用date_default_timezone_get()就可以获得系统 当前设置的 时区.

或者, 不用设置时区, 直接手动调整时间:
在显示/输出时间时, 都统一处理:
不使用date()
统一使用gmdate(), 但是在时间上加上 8*3600 这么多秒 到time()上去!
  1. php 手册上说的: date_default_timezone_set自 PHP 5.1.0 起(此版本日期时间函数被重写了),
string date_default_timezone_get ( void )
本函数返回  "默认时区" ,使用如下“假定”的顺序: 

■用 date_default_timezone_set() 函数设定的时区(如果设定了的话) 

■TZ 环境变量(如果非空) 

■date.timezone 配置选项(如果设定了的话) 

■自己推测(如果操作系统支持) 

■如果以上选择都不成功,则返回 UTC 
string date/gmdate ( string $format [, int $timestamp ] )
返回将整数 timestamp 按照给定的格式字串而产生的字符串。
如果没有给出时间戳则使用 "本地" 当前时间。换句话说,timestamp 是可选的,默认值为 time()。 

如果没有给出时间戳则使用 “本地” 当前时间。换句话说,timestamp 是可选的,默认值为 time()。

<?php
// date_default_timezone_set('Asia/Chongqing');
// ini_set('date.timezone', 'PRC');
// ini_set('date.timezone', 'prc');

$tz = date_default_timezone_get();
echo "默认时区是: $tz";

/* 好像没有设置TZ  (timezone) 这个常量 */
if(defined('TZ')) echo TZ; 
echo "<br />";

echo time();
echo "<br />";
echo gmdate('Y-m-d H:i:s');
echo "<br />";
echo date('Y-m-d H:i:s');

?>

那么time()函数的内部实现, 是不是 通过网络去访问 Greenwich的” 相关时间服务器” 而得到的呢? 好像不是, 因为即使是断了网, 还是能够获得time()函数的值? 应该是通过 操作系统 去实现的??

原文地址

https://www.cnblogs.com/bkylee/p/5260296.html

phpstorm 2017激活 2018/02/04日测试可用

1. 通过Licence Server 激活PHPStorm 2017.1:

  1. http://www.0-php.com:1017(可用,更新于20170621)2018/02/04测试可用

    http://idea.singee77.com/

    http://idea.lanyus.com/ (已被封杀)

    http://idea.qinxi1992.cn/ (测试时不可以)

2. 本地激活PHPStorm 2017.1(不上网):

  1. 加载文件LocalServer.zip
  2. 解压压缩文件,并选择与您的操作系统的名称的文件
  3. 我们给运行该文件的权限并运行该文件
  4. 选择一个许可证服务器,并在许可证服务器地址:指定地址 http://127.0.0.1:1017/
  5. 按下按钮OK

3. 直接用浏览器打开 http://idea.lanyus.com/

点击页面中的“获得注册码”,然后在注册时切换至Activation Code选项,输入获得的注册码一长串字符串,便可以注册成功了!(推荐用这种方式)

4. 若资金允许,请前往https://www.jetbrains.com/idea/buy/购买正版

endroid/qrcode php生成二维码

QR Code

By endroid

Latest Stable Version Build Status Total Downloads Monthly Downloads License Donate

This library helps you generate QR codes in a jiffy.

Installation

Use Composer to install the library.

$ composer require endroid/qrcode

Basic usage

use Endroid\QrCode\QrCode;

$qrCode = new QrCode('Life is too short to be generating QR codes');

header('Content-Type: '.$qrCode->getContentType());
echo $qrCode->writeString();

Advanced usage

use Endroid\QrCode\ErrorCorrectionLevel;
use Endroid\QrCode\LabelAlignment;
use Endroid\QrCode\QrCode;
use Symfony\Component\HttpFoundation\Response;

// Create a basic QR code
$qrCode = new QrCode('Life is too short to be generating QR codes');
$qrCode->setSize(300);

// Set advanced options
$qrCode->setWriterByName('png');
$qrCode->setMargin(10);
$qrCode->setEncoding('UTF-8');
$qrCode->setErrorCorrectionLevel(ErrorCorrectionLevel::HIGH);
$qrCode->setForegroundColor(['r' => 0, 'g' => 0, 'b' => 0]);
$qrCode->setBackgroundColor(['r' => 255, 'g' => 255, 'b' => 255]);
$qrCode->setLabel('Scan the code', 16, __DIR__.'/../assets/fonts/noto_sans.otf', LabelAlignment::CENTER);
$qrCode->setLogoPath(__DIR__.'/../assets/images/symfony.png');
$qrCode->setLogoWidth(150);
$qrCode->setValidateResult(false);

// Directly output the QR code
header('Content-Type: '.$qrCode->getContentType());
echo $qrCode->writeString();

// Save it to a file
$qrCode->writeFile(__DIR__.'/qrcode.png');

// Create a response object
$response = new Response($qrCode->writeString(), Response::HTTP_OK, ['Content-Type' => $qrCode->getContentType()]);

QR Code

Built-in validation reader

You can enable the built-in validation reader (disabled by default) by calling setValidateResult(true). This validation reader does not guarantee that the QR code will be readable by all readers but it helps you provide a minimum level of quality.

The readability of a QR code is primarily determined by the size, the input length, the error correction level and any possible logo over the image so you can tweak these parameters if you are looking for optimal results. Take note that the validator can consume quite amount of additional resources.

Symfony integration

The endroid/qrcode-bundle integrates the QR code library in Symfony for an even better experience.

  • Configure your defaults (like image size, default writer etc.)
  • Generate QR codes quickly from anywhere via the factory service
  • Generate QR codes directly by typing an URL like /qrcode/<text>.png?size=300
  • Generate QR codes or URLs directly from Twig using dedicated functions

Read the bundle documentation for more information.

Versioning

Version numbers follow the MAJOR.MINOR.PATCH scheme. Backwards compatibility breaking changes will be kept to a minimum but be aware that these can occur. Lock your dependencies for production and test your code when upgrading.

License

This bundle is under the MIT license. For the full copyright and license information please view the LICENSE file that was distributed with this source code.

Donation

If this project help you reduce time to develop, you can give me a cup of coffee 🙂

https://packagist.org/packages/endroid/qrcode

https://github.com/endroid/QrCode

 

<pre><?php
namespace app\controllers;
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;

use Endroid\QrCode\ErrorCorrectionLevel;
use Endroid\QrCode\LabelAlignment;
use Endroid\QrCode\QrCode;
use Symfony\Component\HttpFoundation\Response;
/**
 *
 */
class QrcodeController extends Controller
{


    public function actionIndex()
    {
        $rgbs=[
            '0'=>['r'=>'5','g'=>'152','b'=>'71'],//绿色
            '1'=>['r'=>'0','g'=>'100','b'=>'172'],//蓝色
            '2'=>['r'=>'78','g'=>'200','b'=>'149'],//青色
            '3'=>['r'=>'15','g'=>'162','b'=>'255'],//蓝色
            '4'=>['r'=>'249','g'=>'145','b'=>'10'],//黄色
            '5'=>['r'=>'90','g'=>'175','b'=>'156'],//青色
            '6'=>['r'=>'255','g'=>'107','b'=>'149'],//粉色
            '7'=>['r'=>'7','g'=>'170','b'=>'255'],//蓝色
            '8'=>['r'=>'0','g'=>'0','b'=>'0'],//黑色
            '9'=>['r'=>'18','g'=>'219','b'=>'226'],//水蓝色
        ];
        $random_keys=array_rand($rgbs,1);
        $rgb=$rgbs[$random_keys];
        $qrCode = new QrCode('http://m.biaobai.xin');
        $qrCode->setSize(300);
        // Set advanced options
        $qrCode->setWriterByName('png');
        $qrCode->setMargin(10);
        $qrCode->setEncoding('UTF-8');
        $qrCode->setErrorCorrectionLevel(ErrorCorrectionLevel::HIGH);
        $qrCode->setForegroundColor($rgb);
        $qrCode->setBackgroundColor(['r' => 255, 'g' => 255, 'b' => 255]);
//        $qrCode->setLabel('Scan the code', 16, __DIR__.'/../assets/fonts/noto_sans.otf', LabelAlignment::CENTER);
        $qrCode->setLogoPath(__DIR__.'/../logo.png');
        $qrCode->setLogoWidth(80);
        $qrCode->setValidateResult(false);

         // Directly output the QR code
        header('Content-Type: '.$qrCode->getContentType());
        echo $qrCode->writeString();

        // Save it to a file
        //$qrCode->writeFile(__DIR__.'/../qrcode.png');

        // Create a response object
        $response = new Response($qrCode->writeString(), Response::HTTP_OK, ['Content-Type' => $qrCode->getContentType()]);
    }

}


?></pre>

php 正则过滤标题 分词 获取前8个单词 且字符长度大于3

/**
 * 通过商品标题返回8个单词关键词标题
 * @param $title
 * @return string
 */
function getTitle($title){
     //去掉中,英文标点符号和HTML代码
    $str=preg_replace('/\s/',' ',preg_replace("/[[:punct:]]/",' ',strip_tags(html_entity_decode(str_replace(array(',','?','!','¥','(',')',':','‘','’','“','”','《','》',',','…','。','、','&nbsp'),'',$title),ENT_QUOTES))));
    //过滤掉重复字符
    $search_terms = explode(" ", $str);
    foreach ($search_terms as $key => $s) {
        $s = trim($s);
        if (strlen($s) > 3) {
            $search_terms[$key] = $s;
        } else {
            unset($search_terms[$key]);
        }
    }
    $search_terms = array_unique($search_terms);
    if(count($search_terms)>8)
    {
        $title=implode(' ', array_slice($search_terms,0,8));
    }
    else
    {
        $title=implode(' ',$search_terms);
    }
    return $title;
}

原标题

iphone 8 7 6s 6 Screen Protector Tempered Glass Film Case Friendly Anti-Scratch Anti-Fingerprint Bubble Free Compatible 3D Touch for Apple iPhone 8 iphone 7 iphone 6s iphone 6 4.7-Inch (2 Pack)

返回标题

iphone Screen Protector Tempered Glass Film Case Friendly