|
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)都可以是一個陣列。若果
pattern 和
replacement 都是陣列,將以其鍵名在陣列中出現的順序來進行處理。這不一定和索引的數字順序相同。若果使用索引來標識哪個
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 中的每個項目執行搜尋和置換,並返回一個陣列。
若果
pattern 和
replacement 都是陣列,則
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"); ?>
|
本例將輸出:
|
例子 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()。
| |