1. preg_match — 執行一個Regex匹配
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
搜尋subject與pattern給定的Regex的一個匹配.
pattern:
要搜尋的模式,字串類型。
subject :
輸入字串。
matches:
如果提供了參數matches,它將被填充為搜尋結果。 $matches[0]將包含完整模式比對到的文本, $matches[1]將包含第一個捕獲子組匹配到的文本,以此類推。
flags:
flags可以被設定為以下標記值:PREG_OFFSET_CAPTURE 如果傳遞了這個標記,對於每一個出現的匹配返回時會附加字串位移量(相對於目標字串的)。 注意:這會改變填充到matches參數的數組,使其每個元素成為一個由 第0個元素是匹配到的字串,第1個元素是該匹配字串 在目標字串subject中的位移量。
offset:
通常,搜尋從目標字串的開始位置開始。選擇性參數 offset 用於 指定從目標字串的某個未知開始搜尋(單位是位元組)。
傳回值:
preg_match()返回 pattern 的匹配次數。 它的值將是0次(不匹配)或1次,因為 preg_match()在第一次匹配後 將會停止搜尋。 preg_match_all()不同於此,它會一直搜尋subject直到到達結尾。 如果發生錯誤 preg_match()返回 FALSE。
樣本:
複製代碼 代碼如下:<?php
/*
*模式分隔字元後的"i"標記這是一個大小寫不敏感的搜尋
*將會輸出:1
*/
echo preg_match("/,\s*(php)/i", "In my point, PHP is the web scripting language of choice.");
echo "<br/>"."\n";
/*
*將會輸出:Array([0]=>, PHP [1]=>PHP)
*/
$matches = array();
preg_match("/,\s*(php)/i", "In my point, PHP is the web scripting language of choice. I love php", $matches);
print_r($matches);
echo "<br/>"."\n";
/*
*將會輸出:Array([0]=>Array([0]=>, PHP [1]=>11) [1]=>Array([0]=>PHP [1]=>13))
*/
preg_match("/,\s*(php)/i", "In my point, PHP is the web scripting language of choice. I love php", $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
echo "<br/>"."\n";
/*
*將會輸出:Array([0]=>Array([0]=>e php [1]=63) [1]=>Array([0]=>php [1]=>65))
*/
preg_match("/[,a-z]?\s*(php)/i", "In my point, PHP is the web scripting language of choice. I love php", $matches, PREG_OFFSET_CAPTURE, 28);
print_r($matches);
echo "<br/>"."\n";
?>
2.preg_match_all — 執行一個全域Regex匹配
int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )
搜尋subject中所有匹配pattern給定Regex 的匹配結果並且將它們以flag指定順序輸出到matches中. 在第一個匹配找到後, 子序列繼續從最後一次匹配位置搜尋.
pattern:
要搜尋的模式,字串形式。
subject :
輸入字串。
matches:
多維陣列,作為輸出參數輸出所有匹配結果, 數組排序通過flags指定。
flags:
可以結合下面標記使用(注意不能同時使用PREG_PATTERN_ORDER和PREG_SET_ORDER),如果沒有給定排序標記,假定設定為PREG_PATTERN_ORDER:
PREG_PATTERN_ORDER:
結果排序為$matches[0]儲存完整模式的所有匹配, $matches[1]儲存第一個子組的所有匹配,以此類推。
PREG_SET_ORDER:
結果排序為$matches[0]包含第一次匹配得到的所有匹配(包含子組), $matches[1]是包含第二次匹配到的所有匹配(包含子組)的數組,以此類推。
PREG_OFFSET_CAPTURE:
如果這個標記被傳遞,每個發現的匹配返回時會增加它相對目標字串的位移量。 注意這會改變matches中的每一個匹配結果字串元素,使其 成為一個第0個元素為 匹配結果字串,第1個元素為 匹配結果字串在subject中的位移量。
傳回值:
返回完整匹配次數(可能是0),或者如果發生錯誤返回FALSE。
樣本:複製代碼 代碼如下:<?php
/*
*將會輸出:2
*/
echo preg_match_all("/php/i", "In my point, PHP is the web scripting language of choice. I love php", $matches);
echo "<br/>"."\n";
/*
*將會輸出:Array([0]=>, PHP [1]=>PHP)
*/
$matches = array();
preg_match("/[,a-z]?\s*(php)/i", "In my point, PHP is the web scripting language of choice. I love php", $matches);
print_r($matches);
echo "<br/>"."\n";
/*
*將會輸出:Array([0]=>Array([0]=>, PHP [1]=>e php) [1]=>Array([0]=>PHP [1]=>php))
*/
$matches = array();
preg_match_all("/[,a-z]?\s*(php)/i", "In my point, PHP is the web scripting language of choice. I love php", $matches, PREG_PATTERN_ORDER);
print_r($matches);
echo "<br/>"."\n";
/*
*將會輸出:Array([0]=>Array([0]=>Array([0]=>, PHP [1]=>11) [1]=>Array([0]=>PHP [1]=>13)) [1]=>Array([0]=>Array([0]=>e php [1]=>63) [1]=>Array([0]=>php [1]=>65)))
*/
$matches = array();
preg_match_all("/[,a-z]?\s*(php)/i", "In my point, PHP is the web scripting language of choice. I love php", $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE);
print_r($matches);
echo "<br/>"."\n";
/*
*Array([0]=>Array([0]=>e php [1]=>63) [1]=>Array([0]=>php [1]=>65))
*/
$matches = array();
preg_match_all("/[,a-z]?\s*(php)/i", "In my point, PHP is the web scripting language of choice. I love php", $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE, 28);
print_r($matches);
echo "<br/>"."\n";
?>
3.preg_split — 通過一個Regex分隔字串
array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )
通過一個Regex分隔給定字串.
pattern:
用於搜尋的模式,字串形式。
subject:
輸入字串
limit:
如果指定,將限制分隔得到的子串最多隻有limit個,返回的最後一個 子串將包含所有剩餘部分。limit值為-1, 0或null時都代表"不限制", 作為php的標準,你可以使用null跳過對flags的設定。
flags:
flags 可以是任何下面標記的組合(以位或運算 | 組合):
PREG_SPLIT_NO_EMPTY:
如果這個標記被設定, preg_split() 將進返回分隔後的非空部分。
PREG_SPLIT_DELIM_CAPTURE:
如果這個標記設定了,用於分隔的模式中的括號運算式將被捕獲並返回。
PREG_SPLIT_OFFSET_CAPTURE:
如果這個標記被設定, 對於每一個出現的匹配返回時將會附加字串位移量. 注意:這將會改變返回數組中的每一個元素, 使其每個元素成為一個由第0個元素為分隔後的子串,第1個元素為該子串在subject中的位移量組成的數組。
傳回值:
返回一個使用 pattern 邊界分隔 subject 後得到 的子串組成的數組。
樣本:複製代碼 代碼如下:<?php
/*
*將會輸出:
*Array ( [0] => In my point, [1] => is the web scripting language of choice. I love [2] => )
*/
$matches = array();
print_r(preg_split("/php/i", "In my point, PHP is the web scripting language of choice. I love php"));
echo "<br/>"."\n";
/*
*將會輸出:
*Array ( [0] => In my point, [1] => is the web scripting language of choice. I love php )
*/
$matches = array();
print_r(preg_split("/php/i", "In my point, PHP is the web scripting language of choice. I love php", 2));
echo "<br/>"."\n";
/*
*將會輸出:
*Array ( [0] => In my point, [1] => is the web scripting language of choice. I love )
*/
$matches = array();
print_r(preg_split("/php/i", "In my point, PHP is the web scripting language of choice. I love php", -1, PREG_SPLIT_NO_EMPTY));
echo "<br/>"."\n";
?>
4.preg_quote — 轉義Regex字元
string preg_quote ( string $str [, string $delimiter = NULL ] )
preg_quote()需要參數 str 並向其中 每個Regex文法中的字元前增加一個反斜線。 這通常用於你有一些運行時字串 需要作為Regex進行匹配的時候。
Regex特殊字元有: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
str:
輸入字串
delimiter:
如果指定了選擇性參數 delimiter,它也會被轉義。這通常用於 轉義PCRE函數使用的分隔字元。 /是最通用的分隔字元。
傳回值:
返迴轉義後的字串。
樣本:複製代碼 代碼如下:<?php
//在這個例子中,preg_quote($word) 用於保持星號原文涵義,使其不使用Regex中的特殊語義。
$textbody = "This book is *very* difficult to find.";
$word = "*very*";
$textbody = preg_replace ("/" . preg_quote($word) . "/", "<i>" . $word . "</i>", $textbody);
//將會輸出This book is <i>*very*</i> difficult to find.
echo htmlspecialchars($textbody);
?>
5.preg_grep — 返回匹配模式的數組條目
array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )
返回給定數組input中與模式pattern匹配的元素組成的數組.
pattern:
要搜尋的模式, 字串形式.
input:
輸入數組.
flags:
如果設定為PREG_GREP_INVERT, 這個函數返回輸入數組中與 給定模式pattern不匹配的元素組成的數組.
傳回值:
返回使用input中key做索引的數組.
樣本:複製代碼 代碼如下:<?php
$array = array("abc", "dd", "123", "123.22", "word123", "33.2", "0.22");
//返回所有包含浮點數的元素
//輸出:Array ( [3] => 123.22 [5] => 33.2 [6] => 0.22 )
$fl_array = preg_grep("/^(\d+)?\.\d+$/", $array);
print_r($fl_array);
//返回所有包含浮點數的元素
//輸出:Array ( [0] => abc [1] => dd [2] => 123 [4] => word123 )
$fl_array = preg_grep("/^(\d+)?\.\d+$/", $array, PREG_GREP_INVERT);
print_r($fl_array);
?>
6.preg_replace — 執行一個Regex的搜尋和替換
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
搜尋subject中匹配pattern的部分, 以replacement進行替換。
pattern:
要搜尋的模式。可以是一個字串或字串數組。 可以使用一些PCRE修飾符, 包括'e'(PREG_REPLACE_EVAL),可以為這個函數指定。
replacement:
用於替換的字串或字串數組。如果這個參數是一個字串,並且pattern是一個數組,那麼所有的模式都使用這個字串進行替換。如果pattern和replacement都是數組,每個pattern使用replacement中對應的 元素進行替換。如果replacement中的元素比pattern中的少, 多出來的pattern使用Null 字元串進行替換。replacement中可以包含後向引用\\n或(php 4.0.4以上可用)$n,文法上首選後者。 每個 這樣的引用將被匹配到的第n個捕獲子組捕獲到的文本替換。 n可以是0-99,\\0和$0代表完整的模式比對文本。 捕獲子組的序號計數方式為:代表捕獲子組的左括弧從左至右, 從1開始數。如果要在replacement中使用反斜線,必須使用4個("\\\\",譯註:因為這首先是php的字串,經過轉義後,是兩個,再經過 Regex引擎後才被認為是一個原文反斜線)。
當在替換模式下工作並且後向引用後面緊跟著需要是另外一個數字(比如:在一個匹配模式後緊接著增加一個原文數字), 不能使用\\1這樣的文法來描述後向引用。比如, \\11將會使 preg_replace()不能理解你希望的是一個\\1後向引用緊跟一個原文1,還是 一個\\11後向引用後面不跟任何東西。 這種情況下解決方案是使用${1}1。
這建立了一個獨立的$1後向引用, 一個獨立的原文1。 當使用e修飾符時, 這個函數會轉義一些字元(即:'、"、 \ 和 NULL) 然後進行後向引用替換。當這些完成後請確保後向引用解析完後沒有單引號或 雙引號引起的語法錯誤(比如: 'strlen(\'$1\')+strlen("$2")')。確保符合PHP的 字串文法,並且符合eval文法。因為在完成替換後,
引擎會將結果字串作為php代碼使用eval方式進行評估並將傳回值作為最終參與替換的字串。
subject:
要進行搜尋和替換的字串或字串數組。 如果subject是一個數組,搜尋和替換回在subject的每一個元素上進行, 並且傳回值也會是一個數組。
limit:
每個模式在每個subject上進行替換的最大次數。預設是 -1(無限)。
count:
如果指定,將會被填充為完成的替換次數。
傳回值:
如果subject是一個數組, preg_replace()返回一個數組, 其他情況下返回一個字串。 如果匹配被尋找到,替換後的subject被返回,其他情況下 返回沒有改變的 subject。如果發生錯誤,返回 NULL 。
樣本:
使用後向引用緊跟數值原文:複製代碼 代碼如下:<?php
$string = 'April 15, 2003';
/*
*\w+字元重複一次或者多次
*\d+數字重複一次或者多次
*i忽略大小寫
*/
$pattern = '/(\w+) (\d+), (\d+)/i';
/*
*$0 完整的模式比對文本
*${1}1 第一個小括弧中的模式比對文本並且在後面加1
*\\3 第三個小括弧中的模式比對文本
*/
$replacement = '$0:<br/> ${1}1,\\3';
echo preg_replace($pattern, $replacement, $string);
?>
preg_replace()中使用基於索引的數組:複製代碼 代碼如下:$string = 'The quick brown fox jumped over the lazy dog.';
$patterns = array();
$patterns[0] = '/quick/';
$patterns[1] = '/brown/';
$patterns[2] = '/fox/';
$replacements = array();
$replacements[2] = 'bear';
$replacements[1] = 'black';
$replacements[0] = 'slow';
//會輸出:The bear black slow jumped over the lazy dog.
echo preg_replace($patterns, $replacements, $string);
//對模式和替換內容按key進行排序我們可以得到期望的結果.
ksort($patterns);
ksort($replacements);
//會輸出:The slow black bear jumped over the lazy dog.
echo preg_replace($patterns, $replacements, $string);
替換一些值:複製代碼 代碼如下:<?php
$patterns = array ('/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/',
'/^\s*{(\w+)}\s*=/');
$replace = array ('\3/\4/\1\2', '$\1 =');
echo preg_replace($patterns, $replace, '{startDate} = 1999-5-27');
?>
使用修飾符'e':複製代碼 代碼如下:<?php
$html_body = "<p><span>hello</span></p>";
//會輸出:<P><SPAN>hello</SPAN></P>
echo htmlspecialchars(preg_replace("/(<\/?)(\w+)([^>]*>)/e",
"'\\1'.strtoupper('\\2').'\\3'",
$html_body));
?>
剝離空白字元:複製代碼 代碼如下:<?php
$str = 'foo o';
$str = preg_replace('/\s\s+/', ' ', $str);
// 將會改變為'foo o'
echo $str;
?>
使用參數count: 複製代碼 代碼如下:<?php
$count = 0;
echo preg_replace(array('/\d/', '/\s/'), '*', 'xp 4 to', -1 , $count);
//等價於echo preg_replace('/\d|\s/', '', 'xp 4 to', -1 , $count);
echo $count; //3
?>
7.preg_replace_callback — 執行一個Regex搜尋並且使用一個回調進行替換
mixed preg_replace_callback ( mixed $pattern , callable $callback , mixed $subject [, int $limit = -1 [, int &$count ]] )
這個函數的行為除了 可以指定一個 callback 替代 replacement 進行替換 字串的計算,其他方面等同於 preg_replace()。
pattern:
要搜尋的模式,可以使字串或一個字串數組。
callback:
一個回呼函數,在每次需要替換時調用,調用時函數得到的參數是從subject中匹配到的結果。回呼函數返回真正參與替換的字串。
你可能經常會需要callback函數而 僅用於 preg_replace_callback()一個地方的調用。在這種情況下,你可以使用匿名函數來定義一個匿名函數作為preg_replace_callback()調用時的回調。 這樣做你可以保留所有 調用資訊在同一個位置並且不會因為一個不在任何其他地方使用的回呼函數名稱而汙染函數名稱空間。
subject:
要搜尋替換的目標字串或字串數組。
limit:
對於每個模式用於每個 subject 字串的最大可替換次數。 預設是-1(無限制)。
count:
如果指定,這個變數將被填充為替換執行的次數。
樣本:
preg_replace_callback() 和 create_function():複製代碼 代碼如下:<?php
// 將文本中的年份增加一年.
$text = "April fools day is 04/01/2002\n";
$text.= "Last christmas was 12/24/2001\n";
// 回呼函數
function next_year($matches)
{
// 通常: $matches[0]是完成的匹配
// $matches[1]是第一個捕獲子組的匹配
// 以此類推
return $matches[1].($matches[2]+1);
}
/**
*將會輸出:
*April fools day is 04/01/2003
*Last christmas was 12/24/2002
*/
echo preg_replace_callback(
"|(\d{2}/\d{2}/)(\d{4})|",
"next_year",
$text);
//使用create_function
echo preg_replace_callback(
"|(\d{2}/\d{2}/)(\d{4})|",
create_function(
'$matches',
'return $matches[1].($matches[2]+1);'
),
$text);
?>