程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP和正則表達式

PHP和正則表達式

編輯:關於PHP編程

來自:swords的blog  

一個正則表達式是一個特定的格式化模式,可以用來找出一個字符串在另一個字符串中的使用情況。幾個編程語言,包括Visual Basic,Perl,javascript和PHP都支持正則表達式,希望在這篇入門指導的結束,Mitchell(作者自己)可以讓你在PHP程序中能應用一些基本的正則表達式。正則表達式是在各種各樣的程序語言中突出的古怪特征中的一種,但是由於它們看起來是很難的一個概念,所以很多開發者就把它們放到了角落裡,忘記了它們的存在。

讓我們先來看看什麼是正則表達式,為什麼你要在PHP程序中用到它們。

什麼是正則表達式?
你對從一個不錯的老的基於控制的文本編輯器中分離出像BBEdit和notepad的程序,有什麼看法呢?兩個都支持文本輸入,可以讓你保存文本到文件中,但是現在的文本編輯器也支持其它功能,包括查找–代替工具,這讓編輯一個文本文件相當容易。
正則表達式也是相似的,只是更好一些。正則表達式可以被認為一個極其高級的查找-替換工具,讓我們從痛苦中擺脫出來:不必再寫定制的數據確認例子來檢查電子郵件地址或者來確認電話號碼的格式是正確的,如此等等。
任何程序中最普通的函數之一就是數據有效性檢查,PHP捆綁了一些文本檢查函數,允許我們用正則表達式匹配一個字符串,確認有一個空格,有一個問號,等等。
你不知道的可能是,正則表達式可以簡單裝備嗎,當你掌握了一些正則表達式時(這個正則表達式可以用來告訴正則表達式引擎一個字符串中我們想要匹配的部分),你會自問為什麼會把正則表達式扔到角落裡這麼久,^_^。
PHP有兩套函數,用來處理兩種類型的正則表達式:Perl5兼容模式,和Posix標准兼容模式。在這篇文章中我們將看看ereg函數,用遵照Posix標准的搜索表達式工作。雖然它們並沒有Perl5模式那樣強大,但是一種不錯的學習正則表達式的方法。如果你對PHP支持的Perl5兼容正則表達式感興趣,可以到PHP.net網站找一些關於preg函數的細節。
PHP有六個函數來處理正則表達式,它們都把一個正則表達式作為它們的第一個參數,列出如下:
• ereg: 最常用的正則表達式函數, ereg 允許我們搜索跟一個正則表達式匹配的一個字符串.
• ereg_replace: 允許我們搜索跟正則表達式匹配的一個字符串,並用新的字符串代替所有這個表達式出現的地方。
• eregi: 和ereg幾乎是一樣效果,不過忽略大小寫。
• eregi_replace: 和ereg_replace有著一樣的搜索-替換功能,不過忽略大小寫.
• split: 允許我們搜索和正則表達式匹配的字符串,並且以字符串集合的方式返回匹配結果.
• spliti: split函數忽略大小寫的版本.


為什麼使用正則表達式?

如果你不斷地建立不同的函數來檢查或者操作字符串的一部分,現在你可能要放棄所有的這些函數,取而代之的用正則表達式。如果你對下列的問題都答"是的",那麼你肯定要考慮使用正則表達式了:
• 你是否正在寫一些定制的函數來檢查表單數據(比如在電子信箱地址中的一個@,一個點)?
• 你是否寫一些定制的函數,在一個字符串中循環每個字符,如果這個字符匹配了一個特定特征(比如它是大寫的,或者它是一個空格),那麼就替換它?
除了是令人不舒服的字符串檢查和操作方法,如果沒有有效率地寫代碼,上述的兩條也會使你的程序慢下來。你是否更傾向於用下面的代碼檢查一個電子信箱地址呢:
<?php
function validateEmail($email)
{
$hasAtSymbol = strpos($email, "@");
$hasDot = strpos($email, ".");
if($hasAtSymbol && $hasDot)
return true;
else
return false;
}
echo validateEmail("[email protected]");
?>
... 或者使用下面的代碼:

<?php
function validateEmail($email)
{
return ereg("^[a-zA-Z]+@[a-zA-Z]+.[a-zA-Z]+$", $email);
}
echo validateEmail("[email protected]");
?>

可以肯定的是,第一個函數比較容易,而且看起來結構也不錯。但是如果我們用上面的下一個版本的email地址檢查函數不是更容易嗎?
上面展示的第二個函數只用了正則表達式,包括了對ereg函數的一個調用。Ereg 函數返回true或者false,來聲明它的字符串參數是否和正則表達式相匹配。
很多編程者避開正則表達式,只因為它們(在一些情況下)比其它的文本處理方法更慢。正則表達式可能慢的原因是因為它們涉及把字符串在內存中拷貝和粘貼,因為正則表達式的每一個新的部分都對應匹配一個字符串。但是,從我對正則表達式的經驗來說,除非你在文本中幾百個行運行一個復雜的正則表達式,否則性能上的缺陷都可以忽略不計,當把正則表達式作為輸入數據檢查工具時,也很少出現這種情況。


正則表達式語法
在你可以匹配一個字符串到正則表達式之前,你必須先建立正則表達式。開始的時候,正則表達式的語法有點古怪,表達式中的每一個短語代表某個類型的搜索特征。下列是一些最普通的正則表達式,也都對應著一個如何使用它的例子:

字符串頭部
搜索一個字符串的頭部,用^,例如
<?php echo ereg("^hello", "hello world!"); ?>

將返回 true, 但是
<?php echo ereg("^hello", "i say hello world"); ?>

將返回 false, 因為hello不在字符串"I say hello world"的頭部。
字符串尾部

搜索字符串尾部,用$,例如:
<?php echo ereg("bye$", "goodbye"); ?>

將返回true, 但是
<?php echo ereg("bye$", "goodbye my friend"); ?>

將返回 false,因為bye不在字符串"goodbye my friend"的尾部.

任意的單個字符
搜索任意字符,用點(.),例如:
<?php echo ereg(".", "cat"); ?>

將返回true,但是
<?php echo ereg(".", ""); ?>

將返回false,因為我們的要搜索字符串沒有包含字符。你可以用花括號隨意告訴正則表達式引擎它要匹配多少個單個字符。如果我只想匹配5個字符,我可以這樣用ereg:
<?php echo ereg(".$", "12345"); ?>

上面的這段代碼告訴正則表達式引擎當且僅當至少5個連續的字符出現字符串的尾部時返回true.我們也可以限制連續出現的字符的數目:
<?php echo ereg("a$", "aaa"); ?>

在上面的例子裡,我們已經告訴正則表達式引擎,我們的搜索字符串來匹配表達式,它在尾部必須有介於1和3個的"a"字符。
<?php echo ereg("a$", "aaab"); ?>
上面的例子將不會返回true,雖然有三個"a"字符在搜索字符串裡,但是它們不是在字符串的尾部。如果我們把結尾字符串匹配$從正則表達式中去掉,那麼這個字符串是匹配的。
我們也可以告訴正則表達式引擎來匹配至少有確定數目的字符在一行,如果它們存在的,可以匹配更多。 我們可以這樣做:
<?php echo ereg("a$", "aaaa"); ?>

零或多次重復字符
為了告訴正則表達式引擎一個字符可能存在,也可以重復,我們用*字符。這裡的兩個例子都將返回true.
<?php echo ereg("t*", "tom"); ?>
<?php echo ereg("t*", "fom"); ?>
即使第二個例子不包含"t"這個字符,但仍舊返回ture,因為*表示字符可以出現,但不是必須出現。事實上,任何普通的字符串模式都會使上面的ereg調用返回true,因為t字符是可選的.

一或多次重復字符
為了告訴正則表達式引擎一個字符必須存在,也可以重復不止一次,我們用+字符,像
<?php echo ereg("z+", "i like the zoo"); ?>
下面的例子也會返回true:
<?php echo ereg("z+", "i like the zzzzzzoo!"); ?>

零或一次重復字符
我們也可以告訴正則表達式引擎,一個字符必須是或者只存在一次,或者沒有。我們用?字符來做這項工作,就像
<?php echo ereg("c?", "cats are fuzzy"); ?>
如果我們願意,我們完全可以從上面的搜索字符串中刪除c,這個表達式會仍舊返回true.? 的意思是一個c可以出現在搜索字符串的任何地方,但不是必須的。

正則表達式語法 (contd.)
空格字符
為了匹配一個搜索字符串中的空格字符,我們用預定義Posix的

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved