PHP正则表达式preg_match_all修饰符

模式修饰符

下面列出了当前可用的 PCRE 修饰符。括号中提到的名字是 PCRE 内部这些修饰符的名称。 模式修饰符中的空格,换行符会被忽略,其他字符会导致错误。i (PCRE_CASELESS)如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配。

m (PCRE_MULTILINE)默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行), “行首”元字符 (^) 仅匹配字符串的开始位置, 而”行末”元字符 ($) 仅匹配字符串末尾, 或者最后的换行符(除非设置了 D 修饰符)。这个行为和 perl 相同。 当这个修饰符设置之后,“行首”和“行末”就会匹配目标字符串中任意换行符之前或之后,另外, 还分别匹配目标字符串的最开始和最末尾位置。这等同于 perl 的 /m 修饰符。如果目标字符串 中没有 “\n” 字符,或者模式中没有出现 ^ 或 $,设置这个修饰符不产生任何影响。

s (PCRE_DOTALL)如果设置了这个修饰符,模式中的点号元字符匹配所有字符,包含换行符。如果没有这个 修饰符,点号不匹配换行符。这个修饰符等同于 perl 中的/s修饰符。 一个取反字符类比如 [^a] 总是匹配换行符,而不依赖于这个修饰符的设置。

x (PCRE_EXTENDED)如果设置了这个修饰符,模式中的没有经过转义的或不在字符类中的空白数据字符总会被忽略, 并且位于一个未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略。 这个修饰符 等同于 perl 中的 /x 修饰符,使被编译模式中可以包含注释。 注意:这仅用于数据字符。 空白字符 还是不能在模式的特殊字符序列中出现,比如序列 (?( 引入了一个条件子组(译注: 这种语法定义的 特殊字符序列中如果出现空白字符会导致编译错误。 比如(?(就会导致错误)。e (PREG_REPLACE_EVAL)

Warning
This feature was DEPRECATED in PHP 5.5.0, and REMOVED as of PHP 7.0.0.如果设置了这个被弃用的修饰符, preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估执行(eval 函数方式),并使用执行结果 作为实际参与替换的字符串。单引号、双引号、反斜线(\)和 NULL 字符在 后向引用替换时会被用反斜线转义.

This feature was DEPRECATED in PHP 5.5.0, and REMOVED as of PHP 7.0.0.如果设置了这个被弃用的修饰符, preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估执行(eval 函数方式),并使用执行结果 作为实际参与替换的字符串。单引号、双引号、反斜线(\)和 NULL 字符在 后向引用替换时会被用反斜线转义.

Note:

仅 preg_replace() 使用此修饰符,其他 PCRE 函数忽略此修饰符。

A (PCRE_ANCHORED)如果设置了这个修饰符,模式被强制为”锚定”模式,也就是说约束匹配使其仅从 目标字符串的开始位置搜索。这个效果同样可以使用适当的模式构造出来,并且 这也是 perl 种实现这种模式的唯一途径。

D (PCRE_DOLLAR_ENDONLY)如果这个修饰符被设置,模式中的元字符美元符号仅仅匹配目标字符串的末尾。如果这个修饰符 没有设置,当字符串以一个换行符结尾时, 美元符号还会匹配该换行符(但不会匹配之前的任何换行符)。 如果设置了修饰符m,这个修饰符被忽略. 在 perl 中没有与此修饰符等同的修饰符。S当一个模式需要多次使用的时候,为了得到匹配速度的提升,值得花费一些时间 对其进行一些额外的分析。如果设置了这个修饰符,这个额外的分析就会执行。当前, 这种对一个模式的分析仅仅适用于非锚定模式的匹配(即没有单独的固定开始字符)。

U (PCRE_UNGREEDY)这个修饰符逆转了量词的”贪婪”模式。 使量词默认为非贪婪的,通过量词后紧跟? 的方式可以使其成为贪婪的。这和 perl 是不兼容的。 它同样可以使用 模式内修饰符设置 (?U)进行设置, 或者在量词后以问号标记其非贪婪(比如.*?)。

Note:

在非贪婪模式,通常不能匹配超过 pcre.backtrack_limit 的字符。

X (PCRE_EXTRA)这个修饰符打开了 PCRE 与 perl 不兼容的附件功能。模式中的任意反斜线后就 ingen 一个 没有特殊含义的字符都会导致一个错误,以此保留这些字符以保证向后兼容性。 默认情况下,在 perl 中,反斜线紧跟一个没有特殊含义的字符被认为是该字符的原文。 当前没有其他特性由这个修饰符控制。

J (PCRE_INFO_JCHANGED)内部选项设置(?J)修改本地的PCRE_DUPNAMES选项。允许子组重名, (译注:只能通过内部选项设置,外部的 /J 设置会产生错误。)

u (PCRE_UTF8)此修正符打开一个与 perl 不兼容的附加功能。 模式和目标字符串都被认为是 utf-8 的。 无效的目标字符串会导致 preg_* 函数什么都匹配不到; 无效的模式字符串会导致 E_WARNING 级别的错误。 PHP 5.3.4 后,5字节和6字节的 UTF-8 字符序列被考虑为无效(resp. PCRE 7.3 2007-08-28)。 以前就被认为是无效的 UTF-8。

 (PCRE_INFO_JCHANGED)内部选项设置(?J)修改本地的PCRE_DUPNAMES选项。允许子组重名, (译注:只能通过内部选项设置,外部的 /J 设置会产生错误。)u (PCRE_UTF8)此修正符打开一个与 perl 不兼容的附加功能。 模式和目标字符串都被认为是 utf-8 的。 无效的目标字符串会导致 preg_* 函数什么都匹配不到; 无效的模式字符串会导致 E_WARNING 级别的错误。 PHP 5.3.4 后,5字节和6字节的 UTF-8 字符序列被考虑为无效(resp. PCRE 7.3 2007-08-28)。 以前就被认为是无效的 UTF-8。

u (PCRE_UTF8)此修正符打开一个与 perl 不兼容的附加功能。 模式和目标字符串都被认为是 utf-8 的。 无效的目标字符串会导致 preg_* 函数什么都匹配不到; 无效的模式字符串会导致 E_WARNING 级别的错误。 PHP 5.3.4 后,5字节和6字节的 UTF-8 字符序列被考虑为无效(resp. PCRE 7.3 2007-08-28)。 以前就被认为是无效的 UTF-8。

修饰符意义

/ regexp / i
不区分大小写的匹配

/ regexp / s
使句点( . )匹配任何字符,包括换行符( )

/ regexp / x
从模式中删除空白符和注释

/ regexp / m
使 ^ 匹配换行符 ( )之后的内容,美元符号($)匹配换行符 ( )之前的内容

/ regexp / e
如果替换字符串是PHP代码,使用eval()执行该代码来得到实际的替换字符串。

PHP的Perl兼容正则表达式函数也支持在Perl中不支持的其他修饰符

/ regexp / U
颠倒子模式的贪婪性; * 和 + 尽可能少地匹配而不是尽可能多。

/ regexp / u
把模式字符串当作UTF – 8编码对待

/ regexp / X
如果一个反斜杠之后跟着没有特殊意义的字符,将产生一个错误

/ regexp / A
把锚定位在字符串的开头就像模式中有 ^ 一样

/ regexp / D
使 $字符仅匹配一行的末尾

/ regexp / S
使表达式解析器更加小心地检查模式的结构,使得第二次运行时(如在一个循环中)加快速度

各种排行榜出炉:Java 稳坐冠军宝座、Oracle 岌岌可危,我们的大 PHP 呢

2016年只剩下不到一个月的时间了, IT 界最重要的莫过于各种排行榜,除了加班最狠、待遇最好、妹子最多……的 IT 公司外,程序员们最关心的是不是各种编程语言、数据库的排行榜里,PHP 是最好的编程语言还是最好的“数据库”?

C 语言自 2015 年 11 月以来就有下降趋势。在今年之前的整个 15 年的时间内,其评分都在 15%-20% 之间波动,但今年却一反常态,评分跌至 10% 以下,并且没有看到回升的势头。C 语言到底发生了什么?为何一蹶不振?

看来 Java 坐稳 2017 年热门编程语言排行榜冠军宝座了,你的语言上榜没?冠军总是比较忙,这会正和 Kotlin 比编译速度,到底谁更快呢~

除了编程语言,2016 年全球数据库排名也尘埃落定,Oracle 、MySQL 和 Microsoft SQL Server 依然稳坐三甲宝座,不过,Oracle 的地位可就没那么稳固了,跟第二名 MySQL 的差距已缩小至 30 分!看来明年的排行榜有看头了,不知道是@美国网友:”php是世界上最好的数据库“,还是@凡行:“MySQL是世界上最好的编程语言!”说得对呢~@达尔文:”前排出售小板凳。”

同样地位不保的还有第三方 Android 系统 CM 之父,被踢出局的他与乔布斯经历了同样的悲惨境遇,作为 Cyanogen 公司的主要创始人,Steve Kondik 已经从这家公司离职。

这种感觉就像 Firebug 在其官方网站上宣布 —— “Firebug 扩展不再进行开发或维护,我们邀请您使用 Firefox 的内置开发工具以代替”。@世尘悉洞 :“回想起用firebug的岁月,挺伤感的。感谢一路陪伴,虽然现在不怎么使用了,但是还是很感谢之前的陪伴。”讲不出的再见~

虽然开发者的世界少了 Firebug,不过我们的大谷歌回归啦,Google Developers 中国网站正式发布!Google Developers 中国网站是特别为中国开发者而建立的,它汇集了 Google 为全球开发者所提供的开发技术资源,包括 API 文档、开发案例、技术培训的视频。并涵盖了以下关键开发技术和平台产品的信息:

  • Android(developer.android.google.cn)
  • Tensor Flow (www.tensorflow.org)
  • Google Play(developer.android.com/distribute/googleplay/index.html)
  • AdMob(firebase.google.cn/docs/admob)、
  • Firebase(firebase.google.cn)

除了面向中国开发者的 Google Developers 中国网站,谷歌 DeepMind 还面向公众和开发者开放开源 AI 训练平台 DeepMind Lab,这款软件本周在GitHub上线,它看起来像一款卡通视频游戏,但却是精心设计的,目的是让AI开发者对他们机器人的学习加以控制。

当越来越牛逼的机器人取代程序员写代码,会发生什么呢?过去,程序员需要在大学或工作中花费好几年时间才能学习掌握一些编程知识,熟悉了解一些昂贵的服务器性能,而现在,只需几周时间就能搞定一项网页开发编程语言了。基于人工智能生成的代码,为整个行业带来了颠覆创新。

php-fpm添加service服务

Nginx通过FastCGI运行PHP比Apache包含PHP环境有明显的优势,最近有消息称,PHP5.4将很有可能把PHP-FPM补丁包含在内核里,nginx服务器平台上运行PHP将更加轻松,下面我们就来看一篇php-fpm平滑启动并配置服务例子。

我的PHP是源码安装的。php-fpm在PHP 5.3.2以后的版本不支持以前的php-fpm (start|restart|stop|reload) ,那么如果将php-fpm配置成服务,并添加平滑启动/重启。

配置php-fpm.conf(vi  php-7.1.0/etc/php-fpm.conf),将pid(;pid = run/php-fpm.pid)前的;去掉。

因为编译安装php的,所以会在php目录生成很多二进制文件,找到init.d.php-fpm,拷贝到init.d下。

cp  php-7.1.0/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

设置权限,并添加服务

chmod +x /etc/init.d/php-fpm
chkconfig –add php-fpm

以后可以使用如下命令管理php-fpm了

service php-fpm status

service php-fpm start
service php-fpm restart
service php-fpm reload

service php-fpm stop

PHP跳出多层循环

使用下面方法可以直接跳出循环(推荐):

$http = 0;

foreach($arr as $v){

    for($i=1;$i<=3;$i++){
        
        if($http == 200) break 2;

        echo $i,"\n";

        $http = 200;
    }

    echo $v,'这里不会输出';
}

echo 'END';

但是有些特殊情况使 层数不确定,或是很多层时(一般不会有这种情况):可以使用goto;

foreach($arr as $v){
    for($a=1;$a<=3;$a++)
    for($b=1;$b<=3;$b++)
    for($c=1;$c<=3;$c++)
    for($x=1;$x<=3;$x++)
    for($d=1;$d<=3;$d++)
    for($v=1;$v<=3;$v++)
    for($z=1;$z<=3;$z++)
    for($n=1;$n<=3;$n++){

//        if($http == 200) break ??;
        if($http == 200) goto end;

        echo $n,"\n";

        $http = 200;
    }

    echo $v,'这里不会输出';
}
end:

echo 'END';

打造你的php安全程序第一步:禁止掉不安全的php函数(php.ini)

为了使php程序更安全,很多站长都选择了禁用一些比较敏感的函数,那影响php安全的函数到底有哪些呢,下面我们列出了一些:
1、phpinfo()
功能描述:输出 PHP 环境信息以及相关的模块、WEB 环境等信息。
危险等级:中
2、passthru()
功能描述:允许执行一个外部程序并回显输出,类似于 exec()。
危险等级:高
3、exec()
功能描述:允许执行一个外部程序(如 UNIX Shell 或 CMD 命令等)。
危险等级:高
4、system()
功能描述:允许执行一个外部程序并回显输出,类似于 passthru()。
危险等级:高
5、chroot()
功能描述:可改变当前 PHP 进程的工作根目录,仅当系统支持 CLI 模式
PHP 时才能工作,且该函数不适用于 Windows 系统。
危险等级:高
6、scandir()
功能描述:列出指定路径中的文件和目录。
危险等级:中
7、chgrp()
功能描述:改变文件或目录所属的用户组。
危险等级:高
8、chown()
功能描述:改变文件或目录的所有者。
危险等级:高
9、shell_exec()
功能描述:通过 Shell 执行命令,并将执行结果作为字符串返回。
危险等级:高
10、proc_open()
功能描述:执行一个命令并打开文件指针用于读取以及写入。
危险等级:高
11、proc_get_status()
功能描述:获取使用 proc_open() 所打开进程的信息。
危险等级:高
12、error_log()
功能描述:将错误信息发送到指定位置(文件)。
安全备注:在某些版本的 PHP 中,可使用 error_log() 绕过 PHP safe mode,
执行任意命令。
危险等级:低
13、ini_alter()
功能描述:是 ini_set() 函数的一个别名函数,功能与 ini_set() 相同。
具体参见 ini_set()。
危险等级:高
14、ini_set()
功能描述:可用于修改、设置 PHP 环境配置参数。
危险等级:高
15、ini_restore()
功能描述:可用于恢复 PHP 环境配置参数到其初始值。
危险等级:高
16、dl()
功能描述:在 PHP 进行运行过程当中(而非启动时)加载一个 PHP 外部模块。
危险等级:高
17、pfsockopen()
功能描述:建立一个 Internet 或 UNIX 域的 socket 持久连接。
危险等级:高
18、syslog()
功能描述:可调用 UNIX 系统的系统层 syslog() 函数。
危险等级:中
19、readlink()
功能描述:返回符号连接指向的目标文件内容。
危险等级:中
20、symlink()
功能描述:在 UNIX 系统中建立一个符号链接。
危险等级:高
21、popen()
功能描述:可通过 popen() 的参数传递一条命令,并对 popen() 所打开的文件进行执行。
危险等级:高
22、stream_socket_server()
功能描述:建立一个 Internet 或 UNIX 服务器连接。
危险等级:中
23、putenv()
功能描述:用于在 PHP 运行时改变系统字符集环境。在低于 5.2.6 版本的 PHP 中,可利用该函数
修改系统字符集环境后,利用 sendmail 指令发送特殊参数执行系统 SHELL 命令。
危险等级:高

禁用方法如下:
打开/etc/php.ini文件,
查找到 disable_functions ,添加需禁用的函数名,如下:
phpinfo,eval,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status

看过这些函数,站长们应该去检查一下自己的php.ini 看看这些函数是否禁用了。

当然禁止了这些可能会引起安全因素的php函数。你还必须在php.ini里,进一步把php的错误给关闭,这样才更加有针对性的排除你的php被别人利用错误信息进行攻击。
在php.ini里把
display_error = On
改为:
display_error = Off 即可;

windows下Mysql解决启动1067和Fatal error: Can’t open and lock privilege tables: Table ‘mysql.host’ doesn’t exist

Can’t open and lock privilege tables: Table ‘mysql.host’ doesn’t exist

2011年02月26日 星期六 01:43

关于手动修改mysql目录下的my.ini的数据库保存路径后,在启动的时候出错。

查看错误日志后,发现Can’t open and lock privilege tables: Table ‘mysql.host’ doesn’t exist

原错误日志内容:

110226 1:20:46 [Note] Plugin ‘FEDERATED’ is disabled.

C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld: Table ‘mysql.plugin’ doesn’t exist

110226 1:20:46 [ERROR] Can’t open the mysql.plugin table. Please run mysql_upgrade to create it.

InnoDB: The first specified data file D:\mysite\database\ibdata1 did not exist:

InnoDB: a new database to be created!

110226 1:20:47 InnoDB: Setting file D:\mysite\database\ibdata1 size to 10 MB

InnoDB: Database physically writes the file full: wait…

110226 1:20:47 InnoDB: Log file .\ib_logfile0 did not exist: new to be created

InnoDB: Setting log file .\ib_logfile0 size to 10 MB

InnoDB: Database physically writes the file full: wait…

110226 1:20:47 InnoDB: Log file .\ib_logfile1 did not exist: new to be created

InnoDB: Setting log file .\ib_logfile1 size to 10 MB

InnoDB: Database physically writes the file full: wait…

InnoDB: Doublewrite buffer not found: creating new

InnoDB: Doublewrite buffer created

InnoDB: Creating foreign key constraint system tables

InnoDB: Foreign key constraint system tables created

110226 1:20:48 InnoDB: Started; log sequence number 0 0

110226 1:20:48 [ERROR] Fatal error: Can’t open and lock privilege tables: Table ‘mysql.host’ doesn’t exist

从网上查了半天都是linux下的解决方法,没有windows的。不过仔细看了看linux下的解决方法,发现是因为

windows下Mysql解决启动1067和Fatal error: Can't open and lock

这个文件闹得,从日志上来看是因为不能够打开私有权限的表格。

这个文件闹得,从日志上来看是因为不能够打开私有权限的表格。

解决方法直接把这个文件夹全都复制到你要修改的目录下,重启mysql就ok了。

array func_get_args ( void )

func_get_args

(PHP 4, PHP 5)

func_get_args — Returns an array comprising a function’s argument list

说明

array func_get_args ( void )

Gets an array of the function’s argument list.

This function may be used in conjunction with func_get_arg() and func_num_args() to allow user-defined functions to accept variable-length argument lists.

返回值

Returns an array in which each element is a copy of the corresponding member of the current user-defined function’s argument list.