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

如何在PHP中使用正則表達式進行查找替換

編輯:關於PHP編程

1. preg_match — 執行一個正則表達式匹配
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
搜索subject與pattern給定的正則表達式的一個匹配.
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 — 執行一個全局正則表達式匹配
int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )
搜索subject中所有匹配pattern給定正則表達式 的匹配結果並且將它們以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 — 通過一個正則表達式分隔字符串
array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )
通過一個正則表達式分隔給定字符串.
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 — 轉義正則表達式字符
string preg_quote ( string $str [, string $delimiter = NULL ] )
preg_quote()需要參數 str 並向其中 每個正則表達式語法中的字符前增加一個反斜線。 這通常用於你有一些運行時字符串 需要作為正則表達式進行匹配的時候。
正則表達式特殊字符有: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
str:
輸入字符串
delimiter:
如果指定了可選參數 delimiter,它也會被轉義。這通常用於 轉義PCRE函數使用的分隔符。 /是最通用的分隔符。
返回值:
返回轉義後的字符串。
示例:
復制代碼 代碼如下:
<?php
//在這個例子中,preg_quote($word) 用於保持星號原文涵義,使其不使用正則表達式中的特殊語義。
$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 — 執行一個正則表達式的搜索和替換
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使用空字符串進行替換。replacement中可以包含後向引用\\n或(php 4.0.4以上可用)$n,語法上首選後者。 每個 這樣的引用將被匹配到的第n個捕獲子組捕獲到的文本替換。 n可以是0-99,\\0和$0代表完整的模式匹配文本。 捕獲子組的序號計數方式為:代表捕獲子組的左括號從左到右, 從1開始數。如果要在replacement中使用反斜線,必須使用4個("\\\\",譯注:因為這首先是php的字符串,經過轉義後,是兩個,再經過 正則表達式引擎後才被認為是一個原文反斜線)。
當在替換模式下工作並且後向引用後面緊跟著需要是另外一個數字(比如:在一個匹配模式後緊接著增加一個原文數字), 不能使用\\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 — 執行一個正則表達式搜索並且使用一個回調進行替換
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);
?>

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