« 85. 如何加上加上選擇顏色的功能? | (回到Blog入口) | 87. 如何撰寫 PHP 的 Regular Expression? »

86. PHP 的 Regular Expression 函數群整理

jollen 發表於 October 27, 2006 10:10 PM

ereg() 函數

int ereg(string pattern, string string, array [regs]);

將符合 pattern 的子字串放到 regs 陣列裡。string 是原字串,pattern 則是用來尋找特定條件的 regular expression,找到的字串則由左而右依序存放到 regs 陣列裡。ereg() 函數在搜尋字串時有大小寫之分。

$regs[0] 存放原來的字串,因此找到的子字串由 $regs[1] 開始存放。底下是幾個簡單的範例:

//取出 YYYY-MM-DD 日期格式的數字部份 ereg("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs ))
//將 MMMMMM 每二個一組切開 ereg("(.{2})(.{2})(.{2})", $string, $nums);

以第一個範例來看,[0-9] 是一個 pattern,[0-9]{4} 也是一個 pattern,我們利用小括弧將多個 pattern 群組成一個 pattern,因此 ([0-9]{4}) 是一個 pattern,將符合這個 pattern 的子字串放到 $regs 陣列裡。這個範例共有 3 個 pattern,因此 $regs[1]、$regs[2] 與 $regs[3] 存放了符合條件的子字串。

相關函數:eregi(), ereg_replace(), eregi_replace()

ereg_replace() 函數

string ereg_replace(string pattern, string replacement, string string);

取代字串的函數。將符合 pattern 條件的子字串取代成 replacement,string 則是則來的字串,最後傳回完成取代後的字串。ereg_replace() 對字串有大小寫之分。

\\0 ~ \\9 是一種很好用的機制,在 pattern 括弧裡的字串會被記憶到 \\0 ~ \\9 裡,在取代時就可以使用 \\0 ~ \\9 表示括弧裡的字串。取代時,依括弧的位置,由左而右,由外而內依序將括弧裡的字串存放至 \\0 ~ \\9 裡。例如:

使用範例:

<?php
$string = "This is a test."; echo ereg_replace(" is", " was", $string). "<br>"; echo ereg_replace("( )is", "\\1was", $string). "<br>"; echo ereg_replace("(( )is)", "\\2was", $string). "<br>";
$html = '<p><a href="index.php">回首頁</a></p>'; echo ereg_replace("<([^>]|\n)*>", "", $html); // 去除 HTML 標籤
?>

在這個例子裡,ereg_replace("( )is", "\\1was", $string ) 裡的 \\1 為 " " (Space)。ereg_replace("(( )is)", "\\2was", $string) 裡的 \\2 也是 " ",而 \\1 則是 " is"。這有點類似 Perl regular expression 裡括弧的用法。

相關函數:ereg(), eregi(), eregi_replace()

eregi() 函數

int eregi(string pattern, string string, array [regs]);

功能與使用方法和 ereg() 一樣,不過 eregi() 對字串沒有大小寫的分別。

相關函數:ereg(), ereg_replace(), eregi_replace()

eregi_replace() 函數

string eregi_replace(string pattern, string replacement, string string);

功能與使用方法和 ereg_replace() 一樣,不過 eregi_replace() 對字串沒有大小寫的分別。

相關函數:ereg(), eregi(), ereg_replace()

split() 函數

array split(string pattern, string string, int [limit]);

將字串切開成數個子子串。split() 函數以符合 pattern 條件的子字串為邊界,將string 字串切成數個子字串,limit 限定要切割的個數。切割後傳回一個陣列,包含所有被切開的字串。

使用範例:

<?php
$passwd_list = `cat /etc/passwd`; $passwd_list = split( ":", $passwd_list);
for ($i = 0; $i < (count($passwd_list)+1)/7; $i++) { echo "<br>\n";
for ($j = 0; $j < 7; $j++) echo $passwd_list[$i*7+$j]. " "; }
?>

要注意一點,split() 函數對於 pattern 與字串是有大小寫之分的。這個範例主要是將 "/etc/passwd" 裡的字串以 ":" 為界切割成數個子字串。

相關函數:explode(), implode()

sql_regcase() 函數

string sql_regcase(string string);

將 regular expression 裡的 pattern 改成沒有大小寫之分的 pattern,常用來將 SQL 裡的 pattern 改成沒有大小寫之分的寫法。例如:

echo echo sql_regcase("Jollen");

輸出為:

[Jj][Oo][Ll][Ll][Ee][Nn]

再看一個 sql_regcase() 實際運用的例子:

$query = "select * from student where fullname = '". sql_regcase('Chen Jin-Hong'). "'"; echo $qery;

輸出為:

select * from student where fullname = '[Cc][Hh][Ee][Nn] [Jj][Ii][Nn]-[Hh][Oo][Nn][Gg]'

雖然 MySQL 接受這種 regular expression 的寫法,但是筆者並不鼓勵這種寫法,如果只是為了要能判別大小寫夾雜的字串,可以改用這種寫法:

select * from student where upper(fullname) = "CHEN JING-HONG"

--jollen

版權聲明

請參閱頁面底部的 CC 授權條款。此外,Jollen's PHP 專欄禁止引用、修改與轉貼,如果您想與朋友分享的話,我們只允許網站連結(hyperlink)的形式。

發表一個評論

(如果你此前從未在此 Blog 上發表過評論,則你的評論必須在 Blog 主人驗證後才能顯示,請你耐心等候。)

| Top | Jollen's Forum |
Jollen's PHP 專欄採用 Attribution-NonCommercial-NoDerivs 2.5 授權條款
Copyright(c) 2001-2007,2010 www.jollen.org