首页 > php基础

关于正则表达式个人理解的总结

初学正则表达式的时候都有一个疑问,例如:需要匹配串 "_abc_123_" 中 第一对"_"之间的字符,刚开始学习正则表达式的时候会写成 "/_w*_/",匹配的结果就是"abc_123" 而不是"abc"了;大神说加上一个问号,"/_w*?_/",这时候匹配的结果就是"abc"。

我们知道'?'单独使用的时候表示:重复零次或一次,而当'?'出现在重复限定符后面的,起的作用就是懒惰匹配,也就是匹配尽可能少的字符。懒惰限定符说明:

*?:重复任意次,但尽可能少重复
+?:重复1次或更多次,但尽可能少重复
??:重复0次或1次,但尽可能少重复
{n,m}?:重复n到m次,但尽可能少重复
{n,}?:重复n次以上,但尽可能少重复

对的,“尽可能少重复”,这就是对懒惰匹配的粗暴直白的解说。

那么怎么理解“尽可能少重复”呢?我们可以从正则表达式的忽略优先量词来解释了。
忽略优先量词

量词"*?"、"+?"、"??"、"{n,m}?"、"{n,}?"都属于忽略优先量词,忽略优先量词使用的是在?、+、*、{}后面添加?组成的,忽略优先在匹配的时候首先会尝试忽略,如果失败后回溯才会选择尝试。比如`ab??`匹配“abb”会得到‘a’而不是“ab”。当引擎匹配成功a后,由于是忽略优先,引擎首先选择不匹配b,继续查看表达式,发现表达式结束了,那么引擎就直接上报匹配成功。具体我们通过下面的例子一步一步说明忽略优先量词工作原理。
例子

还是上面的例子,用"/_w*?_/"匹配"_abc_123_" 中 第一对"_"之间的字符。

开始匹配第一个'_'之后,‘w*?’首先决定不需要匹配任何字符,因为它是忽略优先量词,这时候就拿表达式'/_w*?_/'中的第二个'_'('w*?'后面的'_')和目标串'_abc_123_'中的'a'匹配,匹配失败,这时候才会拿'w*?'去尝试未匹配的分支(使用w匹配a,尝试匹配a成功)

下一步,是尝试匹配,还是忽略呢?因为'w*?'是忽略优先量词,会选择忽略,那么就是重复上一步,'_'匹配b失败,'w*?'去尝试未匹配的分支ab,以上步骤总共重复了3次后(直到表达式'w*?'后面的'_'和目标串第二个'_'匹配),最终匹配出'abc'。

过程(开始匹配第一个'_'之后):

表达式/_w*?_/'中的第二个'_'和目标串'_abc_123_'中的'a'匹配,匹配失败,'w*?'尝试匹配目标串'_abc_123_'中的'a',匹配成功。
表达式/_w*?_/'中的第二个'_'和目标串'_abc_123_'中的'b'匹配,匹配失败,'w*?'尝试匹配目标串'_abc_123_'中的'ab',匹配成功。
表达式/_w*?_/'中的第二个'_'和目标串'_abc_123_'中的'c'匹配,匹配失败,'w*?'尝试匹配目标串'_abc_123_'中的'abc',匹配成功。
表达式/_w*?_/'中的第二个'_'和目标串'_abc_123_'中的'_'匹配,匹配成功,匹配结束。结果为abc。

以上是阅读《精通正则表达式》关于忽略优先量词一节的想法,如有不对虚心接受各位的指教,谢谢!

总结:当正则表达式和字符串函数都能解决问题时,一定要使用字符串函数,这样不容易出错,最重要的是字符串函数比正则表达式实现性能上要好得多。

阅读全文

php 方法重写:Declaration of should be compatible with that

如果你碰到php 方法重写,参数不同,报错: Declaration of should be compatible with that这种问题不防进入参考一下解决办法吧。

上网搜索了一下,发现许多帖子基本都抄的一样,说什么这是由于 php5.3版本后,要求继承类必须在父类之后定义,如果父类定义在前,继承类在后,就不会出现这个错误。尤其是http://bugs.php.net/bug.php?id=46851上面还煞有介事的给出了正反例:

阅读全文

Drupal开发中需要那些技能呢?

以下是我们从官方网站整理出来Drupal学习中的所需掌握的技术点,希望刚入或者想入Drupal有所参数,也可以少起弯路。

Drupal开发中需要那些技能呢?来,先看一下大屏幕(下图)



按照上面的图示,大概列了一个表:

阅读全文

浅析php代码的规范艺术,适用其他语言

本文以PHP语言为例,介绍一些良好的编程习惯,希望能够对你有所帮助。

1. 规划代码结构

优秀的PHP代码应该有清晰的结构。PHP面向对象的特性允许程序员将应用程序分解为函数或方法。如果代码晦涩难懂,你也可以添加注释,使代码的功能一目了然。编码时应尽量将前端代码(HTML/CSS/JavaScript)与应用程序的服务端规则分开,或者你可以使用遵循MVC模式的PHP框架来构建你的应用程序。

2. 编码风格统一

优秀的PHP代码应该具备统一的风格。比如,为变量和函数制定统一的命名规则,为循环任务(比如数据库存取、错误处理)制定统一的接入标准,或者保持有规律的代码缩进,这些编码习惯都可以让别人阅读代码更加轻松。

3. 可移植性

优秀的PHP代码应该具有可移植性。程序员应学会运用PHP现有的特性(比如魔术引号和短标签等),应该了解产品需求,适应PHP的特点,保证写出的PHP代码具有可移植性和跨平台性。

4. 代码安全性

优秀的PHP代码应该具有安全性。PHP5具有卓越的特性和灵活性,但应用程序的安全往往掌握在程序员的手中。作为专业的PHP开发人员,应该对安全漏洞有一些深入了解,常见的安全漏洞有跨站脚本攻击(XSS)、跨站请求伪造(CSRF)、代码注入漏洞和字符编码漏洞等。使用PHP中的特定功能和函数(比如mysql_real_escape_string等)可以帮助程序员写出安全的代码。

5. 添加注释

代码注释是代码中的重要组成部分,它解释了函数运行的目的,这种注释会在代码以后的维护中提供非常有用的帮助。

6. 避免简写标记

应使用完整的起始标记,不推荐使用简写的起始标记。

7. 用单引号代替双引号

由于PHP会对双引号中的内容进行变量搜索,为了避免这种搜索带来的性能影响,程序员应该使用单引号引用字符串。

8. 转义输出

应该在htmlspecialchars函数中使用ENT_QUOTES参数,保证单引号(')也可以被转义。尽管没有规定必须这样做,但这是一个好习惯。

9. 使用逗号隔开字符串输出

字符串连接符(.)可以将单一的字符串传递给echo语句进行输出,与之相比,逗号可以实现echo语句中字符串的分别输出,这对PHP来说是一个性能改善。

10. 在输出前检查传递值

应该记得在输出前检查$_GET['query'] 的传递值。使用isset函数或是empty函数可以检查变量值是否为空。

阅读全文

PHP流程控制的替代语法

在用wordpress进行二次开发的时候,会在它的模板里面看到一些奇怪的php语法,这些语法在php里面不常用。对于一部分PHPer没见过的代码?难道是那些博客的开发者自己搞的仿PHP的模板语言?其实这些都是PHP的语法,只不过不常用而已,这些都是PHP流程控制的替代语法。

阅读全文