第10章 PHP

04-13Ctrl+D 收藏本站

关灯 直达底部

PHP

20世纪90年代末期Web的迅猛发展导致了PHP的爆炸性流行,并一直持续至今。PHP得以流行的理由之一是,即使非专业人员,只需要稍作准备,就能使用PHP的基本功能。除此之外,PHP 还提供了颇受开发老手欢迎的众多高级特性和函数。PHP 当然能够支持正则表达式,而且提供了至少3套独立的,不相关的正则引擎。

PHP 的三种正则引擎是“preg”、“ereg”和“mb_ereg”。本书介绍的是 preg 引擎提供的函数。它使用 NFA 引擎,通常情况下,在速度和功能方面都要强于其余两者(“preg”读作“p-reg”)。

与之前各章的联系 在开始本章之前,读者必须知道,本章的内容强烈依赖于第1至6章介绍的基础知识。如果读者只对PHP感兴趣,可能会直接从本章开始阅读,但我还是希望他们认真地看一看前言(尤其是关于体例)和前面的章节:第 1、2、3 章介绍了与正则表达式相关的基本概念、特性和技术,第 4、5、6 章介绍了一些理解正则表达式的关键知识,它们可以直接应用到PHP的正则表达式中。前几章讲解的重要概念包括NFA引擎进行匹配基本原理,匹配优先特性、回溯和效率。

接下来我要强调,除了用于速查列表——例如本章的第407页,和第3章从第114页到第123页,我并不希望这本书成为一本参考手册,而希望它成为精通正则表达式的详细教科书。

本章开始简要介绍了preg引擎的历史,然后介绍它的正则流派。接下来的几节详细考察了preg函数的接口,然后是关于preg的效率问题,最后是扩展示例。

preg 的背景和历史 preg 这个名字来自接口函数名的前缀,代表“Perl 的正则表达式(Perl Regular Expressions)”。preg引擎的创始人是Andrei Zmievski,他对当时作为标准的ereg套件的诸多掣肘相当不满意。(ereg表示“扩展的正则表达式(extended regular expressions)”,它能兼容POSIX标准,“扩展”的意思是不仅仅限于一个最简单的正则流派,但是以今天的标准来看,还相当简陋)。

Andrei 的 preg 套件是一组 PCRE(即“Perl 兼容的正则表达式”Perl Compatible Regular Expressions)接口,这是一套非常棒的基于NFA的正则表达式库,完整地模拟了Perl的语法和语意,提供了Andrei想要的能力。

在接触PCRE以前,Andrei先阅读了Perl的源代码,以决定是否能够借用到PHP当中。他显然不是第一个阅读 Perl 的正则表达式源代码的人,也不是第一个认识到代码有多么复杂的人。Perl的正则表达式功能强,速度快,源代码也在许多年间经过了许多人的修改,已经超出了单个开发人员的理解能力。

幸运的是,剑桥大学的Philip Hazel同样已经被Perl的正则表达式的源代码搞得头昏脑胀,所以他写了PCRE库(参见第91页)。好在Philip已经有了现成的可供模拟的语意,所以若干年后,Andrei 找到了这套编写清晰、文档完备、效率出众的库,很方便就能将其绑定到PHP中。

Perl随着时间的流逝而不断发展,PCRE也是这样,PHP亦然。本书针对的是PHP Versions 4.4.3和5.1.4,这两者都兼容PCRE Version6.6(注1)。

如果你不熟悉PHP的版本信息,清注意4.x和5.x是同时维护的,而5.x进行了大规模的扩展。因为两个系列是分开维护和发布的,很可能某个5.x的版本所用的PCRE的版本要低于更晚发布的4.x版本。