搜尋
首頁php教程PHP开发PHP 正規表示式常用函數使用

PHP 正規表示式常用函數使用

Dec 12, 2016 pm 03:51 PM
php正規則

在PHP中有兩套正規表示式函數函式庫。一套是由PCRE(Perl Compatible Regular Expression)庫提供的。 PCRE函式庫使用和Perl相同的語法規則實現了正規表示式的模式匹配,其使用以“preg_”為前綴命名的函數。另一套是由POSIX(Portable Operation System interface)擴充函式庫提供的。 POSIX擴展的正規表示式由POSIX 1003.2定義,一般使用以「ereg_」為前綴命名的函數。
兩套函數庫的功能相似,執行效率稍有不同。一般而言,實現相同的功能,使用PCRE庫的效率略佔優勢。以下詳細介紹其使用方法。
6.3.1 正規表示式的符合
1. preg_match()
函數原型:int preg_match (string $pattern, string $content [, array $matches])
preg_match ()函數在$content字串中搜尋與$pattern給出的正規表示式相符的內容。如果提供了$matches,則將匹配結果放入其 中。 $matches[0]將包含與整個模式相符的文本,$matches[1]將包含第一個捕獲的與括號中的模式單元所匹配的內容,以此類推。該函數只 作一次匹配,最終回傳0或1的匹配結果數。程式碼6.1給出preg_match()函數的一段程式碼範例。
程式碼6.1 日期時間的符合 

<?php 
//需要匹配的字符串。date函数返回当前时间 
$content = "Current date and time is ".date("Y-m-d h:i a").", we are learning PHP together."; 
//使用通常的方法匹配时间 
if (preg_match ("/\d{4}-\d{2}-\d{2} \d{2}:\d{2} [ap]m/", $content, $m)) 
{ 
echo "匹配的时间是:" .$m[0]. "\n"; 
} 
//由于时间的模式明显,也可以简单的匹配 
if (preg_match ("/([\d-]{10}) ([\d:]{5} [ap]m)/", $content, $m)) 
{ 
echo "当前日期是:" .$m[1]. "\n"; 
echo "当前时间是:" .$m[2]. "\n"; 
} 
?>

這是一個簡單動態文字字串匹配實例。假設目前系統時間是“2006年8月17日13點25分”,將輸出如下的內容。
匹配的時間是:2006-08-17 01:25 pm
目前日期是:2006-08-17
目前時間是:01:25 pm
2. ereg()和eregi()
ereg()是POSIX擴充函式庫中正規表示式的符合函數。 eregi()是ereg()函數的忽略大小寫的版 本。二者與preg_match的功能類似,但函數傳回的是一個布林值,表示符合成功與否。需要說明的是,POSIX擴充庫函數的第一個參數接受的是正規則 表達式字串,即不需要使用分界符。例如,代碼6.2是一個關於檔案名稱安全檢驗的方法。
程式碼6.2 檔案名稱的安全檢定 

<?php 
$username = $_SERVER[&#39;REMOTE_USER&#39;]; 
$filename = $_GET[&#39;file&#39;]; 
//对文件名进行过滤,以保证系统安全 
if (!ereg(&#39;^[^./][^/]*$&#39;, $userfile)) 
{ 
die(&#39;这不是一个非法的文件名!&#39;); 
} 
//对用户名进行过滤 
if (!ereg(&#39;^[^./][^/]*$&#39;, $username)) 
{ 
die(&#39;这不是一个无效的用户名&#39;); 
} 
//通过安全过滤,拼合文件路径 
$thefile = "/home/$username/$filename"; 
?>

通常情況下,使用與Perl相容的正規表示式比對函數perg_match(),將比使用ereg()或eregi()的速度更快。如果只是尋找字串中是否包含某個子字串,建議使用strstr()或strpos()函數。
3. preg_grep()
函數原型:array preg_grep (string $pattern, array $input)
preg_grep()函數傳回一個數組,其中包含了$input數組中與給定的$pattern模式相符的單元。對於輸入數組$input中的每個元素,preg_grep()也只進行一次匹配。程式碼6.3給出的範例簡單地說明了preg_grep()函數的使用。
程式碼6.3 陣列查詢比對

<?php 
$subjects = array( 
"Mechanical Engineering", "Medicine", 
"Social Science", "Agriculture", 
"Commercial Science", "Politics" 
); 
//匹配所有仅由有一个单词组成的科目名 
$alonewords = preg_grep("/^[a-z]*$/i", $subjects); 
?>

6.3.2 進行全域正規表示式比對
1. preg_match_all()
與preg_match()函數類似。如果使用了第三個參數,將把所有可能的匹配結果放入。本函數傳回整個模 式匹配的次數(可能為0),如果出錯回傳False。下面是將文字中的URL連結位址轉換為HTML程式碼的範例。代碼6.4是 preg_match_all()函數的使用範例。
程式碼6.4 將文字中的連結位址轉成HTML 

<?php 
//功能:将文本中的链接地址转成HTML 
//输入:字符串 
//输出:字符串 
function url2html($text) 
{ 
//匹配一个URL,直到出现空白为止 
preg_match_all("/http:\/\/?[^\s]+/i", $text, $links); 
//设置页面显示URL地址的长度 
$max_size = 40; 
foreach($links[0] as $link_url) 
{ 
//计算URL的长度。如果超过$max_size的设置,则缩短。 
$len = strlen($link_url); 
if($len > $max_size) 
{ 
$link_text = substr($link_url, 0, $max_size)."..."; 
} else { 
$link_text = $link_url; 
} 
//生成HTML文字 
$text = str_replace($link_url,"<a href=&#39;$link_url&#39;>$link_text</a>",$text); 
} 
return $text; 
} 
//运行实例 
$str = “这是一个包含多个URL链接地址的多行文字。欢迎访问http://www.jb51.net”; 
print url2html($str); 
/*输出结果 
这是一个包含多个URL链接地址的多行文字。欢迎访问<a href=&#39;http://www.jb51.net&#39;> 
http://www.jb51.net</a> 
*/ 
?>

2.多行匹配
僅使用POSIX下的正規表式函數,很難進行複雜的配對操作。例如,對整個文件(尤其是多行文字)進行匹配查找。使用ereg()對此進行操作的一個方法是分行處理。程式碼6.5的範例示範了ereg()如何將INI檔案的參數賦值到陣列之中。
程式碼6.5 檔案內容的多行符合 

<?php 
$rows = file(&#39;php.ini&#39;); //将php.ini文件读到数组中 
//循环遍历 
foreach($rows as $line) 
{ 
If(trim($line)) 
{ 
//将匹配成功的参数写入数组中 
if(eregi("^([a-z0-9_.]*) *=(.*)", $line, $matches)) 
{ 
$options[$matches[1]] = trim($matches[2]); 
} 
unset($matches); 
} 
} 
//输出参数结果 
print_r($options); 
?>

提示
這裡只是為了方便說明問題。解析一個*.ini文件,最佳方法是使用函數parse_ini_file()。此函數直接將*.ini檔案解析到一個大數組中。
6.3.3 正規表示式的替換
1. ereg_replace()和eregi_replace()
函數原型:string ereg_replace (string $pattern, string $replacement, string $string)
string eregi_replace (string $pattern, string $replacement, string $string)
ereg_replace()在$string中搜尋模式字串$pattern,並將所匹配結果替換 為$replacement。當$pattern中包含模式單元(或子模式)時,$replacement中形如「1」或「$1」的位置將依序被這些子 模式所匹配的內容替換。而「
eregi_replace()和ereg_replace()的功能一致,只是前者忽略大小寫。程式碼6.6是本函數的應用實例,這段程式碼示範如何對程式原始碼做簡單的清理工作。
程式碼6.6 原始碼的清理 

<?php 
$lines = file(&#39;source.php&#39;); //将文件读入数组中 
for($i=0; $i<count($lines); $i++) 
{ 
//将行末以“\\”或“#”开头的注释去掉 
$lines[$i] = eregi_replace("(\/\/|#).*$", "", $lines[$i]); 
//将行末的空白消除 
$lines[$i] = eregi_replace("[ \n\r\t\v\f]*$", "\r\n", $lines[$i]); 
} 
//整理后输出到页面 
echo htmlspecialchars(join("",$lines)); 
?>

2.preg_replace()
函数原型:mixed preg_replace (mixed $pattern, mixed $replacement, mixed $subject [, int $limit])
preg_replace较ereg_replace的功能更加强大。其前三个参数均可以使用数组;第四个参数$limit可以设置替换的次数,默认为全部替换。代码6.7是一个数组替换的应用实例。
代码6.7 数组替换 

<?php 
//字符串 
$string = "Name: {Name}<br>\nEmail: {Email}<br>\nAddress: {Address}<br>\n"; 
//模式 
$patterns =array( 
"/{Address}/", 
"/{Name}/", 
"/{Email}/" 
); 
//替换字串 
$replacements = array ( 
"No.5, Wilson St., New York, U.S.A", 
"Thomas Ching", 
"tom@emailaddress.com", 
); 
//输出模式替换结果 
print preg_replace($patterns, $replacements, $string); 
?>

输出结果如下。
Name: Thomas Ching",
Email: tom@emailaddress.com
Address: No.5, Wilson St., New York, U.S.A
在preg_replace的正则表达式中可以使用模式修正符“e”。其作用是将匹配结果用作表达式,并且可以进行重新运算。例如: 

<?php 
$html_body = “<HTML><Body><h1 id="TEST">TEST</h1>My Picture<Img src=”my.gif”></Body></HTML>”; 
//输出结果中HTML标签将全部为小写字母 
echo preg_replace ( 
"/(<\/?)(\w+)([^>]*>)/e", 
"&#39;\\1&#39;.strtolower(&#39;\\2&#39;).&#39;\\3&#39;", //此处的模式变量\\2将被strtolower转换为小写字符 
$html_body); 
?>

提示
preg_replace函数使用了Perl兼容正则表达式语法,通常是比ereg_replace更快的替代方案。如果仅对字符串做简单的替换,可以使用str_replace函数。
6.3.4 正则表达式的拆分
1.split()和spliti()
函数原型:array split (string $pattern, string $string [, int $limit])
本函数返回一个字符串数组,每个单元为$string经正则表达式$pattern作为边界分割出的子串。如 果设定了$limit,则返回的数组最多包含$limit个单元。而其中最后一个单元包含了$string中剩余的所有部分。spliti是split的 忽略大小版本。代码6.8是一个经常用到关于日期的示例。
代码6.8 日期的拆分 

<?php 
$date = "08/30/2006"; 
//分隔符可以是斜线,点,或横线 
list($month, $day, $year) = split (&#39;[/.-]&#39;, $date); 
//输出为另一种时间格式 
echo "Month: $month; Day: $day; Year: $year<br />\n"; 
?>

2.preg_split()
本函数与split函数功能一致。代码6.9是一个查找文章中单词数量的示例。
代码6.9 查找文章中单词数量  

<?php 
$seek = array(); 
$text = "I have a dream that one day I can make it. So just do it, nothing is impossible!"; 
//将字符串按空白,标点符号拆分(每个标点后也可能跟有空格) 
$words = preg_split("/[.,;!\s&#39;]\s*/", $text); 
foreach($words as $val) 
{ 
$seek[strtolower($val)] ++; 
} 
echo "共有大约" .count($words). "个单词。"; 
echo "其中共有" .$seek[&#39;i&#39;]. "个单词“I”。"; 
?>

提示
preg_split() 函数使用了Perl兼容正则表达式语法,通常是比split()更快的替代方案。使用正则表达式的方法分割字符串,可以使用更广泛的分隔字符。例如,上面 对日期格式和单词处理的分析。如果仅用某个特定的字符进行分割,建议使用explode()函数,它不调用正则表达式引擎,因此速度是最快的。 

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器