讀古今文學網 > 精通正則表達式(第3版) > 第10章 PHP >

第10章 PHP

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版本。