亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

PHP正則替換函數preg_replace和preg_replace_callback使用總結

2024-05-04 23:25:48
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了PHP正則替換函數preg_replace和preg_replace_callback使用總結,本文是在寫一個模板引擎遇到一個特殊需求時總結而來,需要的朋友可以參考下
 
 

在編寫PHP模板引擎工具類時,以前常用的一個正則替換函數為 preg_replace(),加上正則修飾符 /e,就能夠執行強大的回調函數,實現模板引擎編譯(其實就是字符串替換)。

詳情介紹參考博文:PHP函數preg_replace() 正則替換所有符合條件的字符串

應用舉例如下:

復制代碼代碼如下:

<?php
/**
 * 模板解析類
 */
class Template {

 

 public function compile($template) {

  // if邏輯
  $template = preg_replace("//</!/-/-/{if/s+(.+?)/}/-/-/>/e", "/$this->ifTag('//1')", $template);

  return $template;
 }

 /**
  * if 標簽
  */
 protected function ifTag($str) {

  //$str = stripslashes($str); // 去反轉義

  return '<?php if (' . $str . ') { ?>';
 }
}

$template = 'xxx<!--{if $user[/'userName/']}-->yyy<!--{if $user["password"]}-->zzz';

$tplComplier = new Template();

$template = $tplComplier->compile($template);

echo $template;

?>

 

輸出結果為:

復制代碼代碼如下:

xxx<?php if ($user['userName']) { ?>yyy<?php if ($user[/"password/"]) { ?>zzz

 

仔細觀察,發現 $user["password"] 中的雙引號被轉義了,這不是我們想要的結果。

為了能夠正常輸出,還必須反轉義一下,但是,如果字符串中本身含有反轉義雙引號的話,我們此時反轉義,原本的反轉義就變成了非反轉義了,這個結果又不是我們想要的,所以說這個函數在這方面用的不爽!

后來,發現一個更專業級的 正則替換回調函數 preg_replace_callback()。

 

復制代碼代碼如下:

mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] )
本函數的行為幾乎和 preg_replace() 一樣,除了不是提供一個 replacement 參數,而是指定一個 callback 函數。該函數將以目標字符串中的匹配數組作為輸入參數,并返回用于替換的字符串。

 

回調函數 callback:

一個回調函數,在每次需要替換時調用,調用時函數得到的參數是從subject 中匹配到的結果。回調函數返回真正參與替換的字符串。這是該回調函數的簽名:

復制代碼代碼如下:

string handler ( array $matches )

 

像上面所看到的,回調函數通常只有一個參數,且是數組類型。

羅列一些有關preg_replace_callback()函數的實例:

Example #1 preg_replace_callback() 和 匿名函數

 

復制代碼代碼如下:

<?php
/* 一個unix樣式的命令行過濾器,用于將段落開始部分的大寫字母轉換為小寫。 */
$fp = fopen("php://stdin", "r") or die("can't read stdin");
while (!feof($fp)) {
    $line = fgets($fp);
    $line = preg_replace_callback(
        '|<p>/s*/w|',
        function ($matches) {
            return strtolower($matches[0]);
        },
        $line
    );
    echo $line;
}
fclose($fp);
?>

 

如果回調函數是個匿名函數,在PHP5.3中,通過關鍵字use,支持給匿名函數傳多個參數,如下所示:

 

復制代碼代碼如下:

<?php 
$string = "Some numbers: one: 1; two: 2; three: 3 end"; 
$ten = 10; 
$newstring = preg_replace_callback( 
    '/(//d+)/', 
    function($match) use ($ten) { return (($match[0] + $ten)); }, 
    $string 
    ); 
echo $newstring; 
#prints "Some numbers: one: 11; two: 12; three: 13 end"; 
?>

 

Example #2 preg_replace_callback() 和 一般函數

 

復制代碼代碼如下:

<?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);
}
echo preg_replace_callback(
            "|(/d{2}//d{2}/)(/d{4})|",
            "next_year",
            $text);

 

?>

 

Example #3 preg_replace_callback() 和 類方法

如何在類的內部調用非靜態函數?你可以按如下操作:
對于 PHP 5.2,第二個參數 像這樣 array($this, 'replace') :

復制代碼代碼如下:

<?php
class test_preg_callback{

 

  private function process($text){
    $reg = "//{([0-9a-zA-Z/- ]+)/:([0-9a-zA-Z/- ]+):?/}/";
    return preg_replace_callback($reg, array($this, 'replace'), $text);
  }
  
  private function replace($matches){
    if (method_exists($this, $matches[1])){
      return @$this->$matches[1]($matches[2]);     
    }
  }  
}
?>

 

對于 PHP5.3,第二個參數像這樣 "self::replace" :
注意,也可以是 array($this, 'replace')。

復制代碼代碼如下:

<?php
class test_preg_callback{

 

  private function process($text){
    $reg = "//{([0-9a-zA-Z/- ]+)/:([0-9a-zA-Z/- ]+):?/}/";
    return preg_replace_callback($reg, "self::replace", $text);
  }
  
  private function replace($matches){
    if (method_exists($this, $matches[1])){
      return @$this->$matches[1]($matches[2]);     
    }
  }  
}
?>

 


根據上面所學到的知識點,把模板引擎類改造如下:

 

復制代碼代碼如下:

<?php
/**
 * 模板解析類
 */
class Template {

 

 public function compile($template) {

  // if邏輯
  $template = preg_replace_callback("//</!/-/-/{if/s+(.+?)/}/-/-/>/", array($this, 'ifTag'), $template);

  return $template;
 }

 /**
  * if 標簽
  */
 protected function ifTag($matches) {
  return '<?php if (' . $matches[1] . ') { ?>';
 }
}

$template = 'xxx<!--{if $user[/'userName/']}-->yyy<!--{if $user["password"]}-->zzz';

$tplComplier = new Template();

$template = $tplComplier->compile($template);

echo $template;

?>

 

輸出結果為:

復制代碼代碼如下:

xxx<?php if ($user['userName']) { ?>yyy<?php if ($user["password"]) { ?>zzz

 

正是我們想要的結果,雙引號沒有被反轉義!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲日韩中文字幕| 欧美日本亚洲视频| 大伊人狠狠躁夜夜躁av一区| 亚洲国产免费av| 欧美视频免费在线| 亚洲男人天堂2024| 国产一区二区黄| 欧美性猛交xxxxx水多| 国产亚洲视频在线观看| 日韩精品高清在线| 国产成人精品网站| 成人激情视频小说免费下载| 国产91免费观看| 91国自产精品中文字幕亚洲| 国产精品影片在线观看| 成人免费大片黄在线播放| 成人免费激情视频| 精品呦交小u女在线| 欧美大尺度在线观看| 久久99精品久久久久久琪琪| 欧美大胆在线视频| 久久久久久网站| 欧美在线视频免费播放| 97人人爽人人喊人人模波多| 日韩中文在线中文网三级| 欧美性猛交xxxx富婆弯腰| 日韩av一区二区在线观看| 国产成人av在线| 日本免费在线精品| 精品人伦一区二区三区蜜桃网站| 精品欧美国产一区二区三区| 亚洲精品久久久久久久久| 日韩成人激情影院| 九九久久久久久久久激情| 国产精品美女www爽爽爽视频| 国产精品一区二区三区在线播放| 日韩在线视频免费观看高清中文| 久久亚洲精品国产亚洲老地址| 欧美黄色小视频| 欧美激情精品久久久久久蜜臀| 亚洲精品99999| 91亚洲va在线va天堂va国| 成人黄色在线播放| 欧美另类高清videos| 欧美日韩加勒比精品一区| 久久久久一本一区二区青青蜜月| 免费av在线一区| 久久久久久尹人网香蕉| 国产欧美精品xxxx另类| 久久久久久久激情视频| 亚洲开心激情网| 久久久www成人免费精品张筱雨| 亚洲国产精品嫩草影院久久| 亚洲最大福利视频网站| 91精品在线影院| 国产日韩在线免费| 在线亚洲欧美视频| 日韩国产欧美区| 亚洲香蕉伊综合在人在线视看| 国产欧美日韩中文字幕| 欧美裸体xxxx极品少妇| 黄色精品在线看| 日韩高清人体午夜| 午夜精品国产精品大乳美女| 欧美一级免费看| 欧美日韩国产综合视频在线观看中文| 97av视频在线| 97婷婷涩涩精品一区| 久久激情五月丁香伊人| 91网在线免费观看| 国产精品极品尤物在线观看| 国产精品女主播| 国产欧美一区二区三区久久| 亚洲欧美日韩在线一区| 国产一区二区免费| 91精品国产综合久久香蕉的用户体验| 国产成人在线播放| 国产精品99久久久久久www| 怡红院精品视频| 欧美日韩激情小视频| 久久久久久久久久国产精品| 亚洲天堂2020| 精品国内自产拍在线观看| 日韩欧美中文免费| 成人精品视频99在线观看免费| 91国产视频在线| 欧美日韩久久久久| 在线视频欧美日韩| 成人性生交大片免费看小说| 97涩涩爰在线观看亚洲| 91精品国产高清自在线| 超碰97人人做人人爱少妇| 欧美亚洲国产日本| 美女性感视频久久久| 欧洲成人在线视频| 国产v综合ⅴ日韩v欧美大片| 欧美猛少妇色xxxxx| 性欧美视频videos6一9| 成人xxxxx| 黄色成人在线播放| 91精品视频网站| 欧美丰满老妇厨房牲生活| 成人免费福利在线| 6080yy精品一区二区三区| 日韩av高清不卡| 少妇久久久久久| 久久免费观看视频| 精品国模在线视频| 97超级碰在线看视频免费在线看| 欧美激情中文字幕在线| 欧美精品18videos性欧| 高清欧美性猛交xxxx| 成人在线播放av| 亚洲国产天堂久久综合| 亚洲在线观看视频| 亚洲精品国产精品国产自| 久久精品国产亚洲精品| 97热精品视频官网| 国产精品久久久| 国产一区二区色| 欧美日韩高清在线观看| 日韩美女在线观看| 国产精品久久久一区| 日韩一级裸体免费视频| 欧美精品videos另类日本| 国产精品pans私拍| 91高潮精品免费porn| 久久在线观看视频| 91超碰中文字幕久久精品| 日韩一区二区久久久| 久久久久亚洲精品国产| 国产精品视频免费观看www| 久久久久久伊人| 91精品在线看| 欧美午夜精品伦理| 国产a级全部精品| 欧美综合一区第一页| 欧美性猛交xxxx乱大交3| 亚洲精品中文字幕av| 欧美黄色www| 国产精品普通话| 青青草国产精品一区二区| 国产69精品久久久久9| 国产91精品久久久久久| 欧美一区二区大胆人体摄影专业网站| 久久综合88中文色鬼| 欧洲日韩成人av| 亚洲欧美变态国产另类| 国产精品久久久久7777婷婷| 97精品国产97久久久久久| 日韩高清有码在线| 久久国产精品久久久久久| 欧美韩日一区二区| 中文字幕日韩在线观看| 久久精品精品电影网| 全球成人中文在线| 97超碰国产精品女人人人爽| 成人国产精品一区二区| 国产91精品高潮白浆喷水| 国产欧美va欧美va香蕉在线| 亚洲美女动态图120秒| 久久久久久久香蕉网| 国产91在线播放精品91| 成人在线视频网站|