preg_replace

(PHP 3 >= 3.0.9, PHP 4, PHP 5)

preg_replace -- 執行正則表達式的搜尋和置換

說明

mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )

subject 中搜尋 pattern 模式的符合項並置換為 replacement。若果指定了 limit,則僅置換 limit 個符合,若果省略 limit 或是其值為 -1,則所有的符合項都會被置換。

replacement 可以包括 \\n 形式或(自 PHP 4.0.4 起)$n 形式的逆向引用,偏好使用後者。每個此種引用將被置換為與第 n 個被捕捉的括號內的子模式所符合的文字。n 可以從 0 到 99,其中 \\0$0 指的是被整個模式所符合的文字。對左圓括號從左到右計數(從 1 開始)以取得子模式的數目。

對置換模式在一個逆向引用後面緊接著一個數字時(即:緊接在一個符合的模式後面的數字),不能使用熟悉的 \\1 符號來表示逆向引用。舉例說 \\11,將會使 preg_replace() 搞不清楚是想要一個 \\1 的逆向引用後面跟著一個數字 1 還是一個 \\11 的逆向引用。本例中的解決方法是使用 \${1}1。這會形成一個隔離的 $1 逆向引用,而使另一個 1 只是單純的文字。

例子 1. 逆向引用後面緊接著數字的用法

<?php
$string 
"April 15, 2003";
$pattern "/(\w+) (\d+), (\d+)/i";
$replacement "\${1}1,\$3";
print 
preg_replace($pattern$replacement$string);

/* Output
   ======

April1,2003

 */
?>

若果搜尋到符合項,則會返回被置換後的 subject,否則返回原來不變的 subject

preg_replace() 的每個參數(除了 limit)都可以是一個陣列。若果 patternreplacement 都是陣列,將以其鍵名在陣列中出現的順序來進行處理。這不一定和索引的數字順序相同。若果使用索引來標識哪個 pattern 將被哪個 replacement 來置換,應該在呼叫 preg_replace() 之前用 ksort() 對陣列進行排序。

例子 2. 在 preg_replace() 中使用索引陣列

<?php
$string 
"The quick brown fox jumped over the lazy dog.";

$patterns[0] = "/quick/";
$patterns[1] = "/brown/";
$patterns[2] = "/fox/";

$replacements[2] = "bear";
$replacements[1] = "black";
$replacements[0] = "slow";

print 
preg_replace($patterns$replacements$string);

/* Output
   ======

The bear black slow jumped over the lazy dog.

*/

/* By ksorting patterns and replacements,
   we should get what we wanted. */

ksort($patterns);
ksort($replacements);

print 
preg_replace($patterns$replacements$string);

/* Output
   ======

The slow black bear jumped over the lazy dog.

*/

?>

若果 subject 是個陣列,則會對 subject 中的每個項目執行搜尋和置換,並返回一個陣列。

若果 patternreplacement 都是陣列,則 preg_replace() 會依次從中分別取出值來對 subject 進行搜尋和置換。若果 replacement 中的值比 pattern 中的少,則用空字串作為餘下的置換值。若果 pattern 是陣列而 replacement 是字串,則對 pattern 中的每個值都用此字串作為置換值。反過來則沒有意義了。

/e 修正符使 preg_replace()replacement 參數當作 PHP 代碼(在適當的逆向引用置換完之後)。提示:要確保 replacement 構成一個合法的 PHP 代碼字串,否則 PHP 會在報告在包括 preg_replace() 的行中出現語法解析錯誤。

例子 3. 置換數個值

<?php
$patterns 
= array ("/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/",
                   
"/^\s*{(\w+)}\s*=/");
$replace = array ("\\3/\\4/\\1\\2""$\\1 =");
print 
preg_replace ($patterns$replace"{startDate} = 1999-5-27");
?>

本例將輸出:

$startDate = 5/27/1999

例子 4. 使用 /e 修正符

<?php
preg_replace 
("/(<\/?)(\w+)([^>]*>)/e",
              
"'\\1'.strtoupper('\\2').'\\3'",
              
$html_body);
?>

這將使輸入字串中的所有 HTML 旗標變成大寫。

例子 5. 將 HTML 轉換成文字

<?php
// $document 應包括一個 HTML 文件。
// 本例將去掉 HTML 旗標,javascript 代碼
// 和空白字元。還會將一些通用的
// HTML 實體轉換成相應的文字。

$search = array ("'<script[^>]*?>.*?</script>'si",  // 去掉 javascript
                 
"'<[\/\!]*?[^<>]*?>'si",           // 去掉 HTML 旗標
                 
"'([\r\n])[\s]+'",                 // 去掉空白字元
                 
"'&(quot|#34);'i",                 // 置換 HTML 實體
                 
"'&(amp|#38);'i",
                 
"'&(lt|#60);'i",
                 
"'&(gt|#62);'i",
                 
"'&(nbsp|#160);'i",
                 
"'&(iexcl|#161);'i",
                 
"'&(cent|#162);'i",
                 
"'&(pound|#163);'i",
                 
"'&(copy|#169);'i",
                 
"'&#(\d+);'e");                    // 作為 PHP 代碼運行

$replace = array ("",
                  
"",
                  
"\\1",
                  
"\"",
                  
"&",
                  
"<",
                  
">",
                  
" ",
                  
chr(161),
                  
chr(162),
                  
chr(163),
                  
chr(169),
                  
"chr(\\1)");

$text preg_replace ($search$replace$document);
?>

注: limit 參數是 PHP 4.0.1pl2 之後加入的。

參見 preg_match()preg_match_all()preg_split()