close
這是我參考 PEAR:DB 裡面的 prepare 部份寫出來的一個字串解析與取代的物件。
它可以載入一張函數表,根據這張函數表來對字串中的一些字元作轉換的動作,有點類似 sprintf 函數,不過每個字元的轉換可以自訂(這也就是函數表的功用)
class 字串解析 {
private $快取 = array();
private $解析表 = array();
private $例外字元 = '';
function 載入(&$解析表 = array(), $例外字元 = '', $取代 = true) {
if (mb_strlen($例外字元) < 2) {
$this->例外字元 = $例外字元;
}
if ($取代) {
$this->解析表 = array();
}
foreach ($解析表 as $字元 => $函數) {
if (mb_strlen($字元) == 1 && is_callable($函數)) {
$this->解析表[$字元] = $函數;
}
}
unset($this->解析表[$this->例外字元]);
$this->快取 = array();
}
function &解析($樣板, $快取 = true) {
$堆疊 = array();
$輸出 = array();
$前字 = ' ';
$長度 = mb_strlen($樣板);
for ($索引 = 0; $索引 < $長度; $索引++) {
$字元 = mb_substr($樣板, $索引, 1);
if (array_key_exists($字元, $this->解析表)) {
if ($前字 == $this->例外字元) {
array_pop($堆疊);
$堆疊[] = $字元;
} else {
$輸出[] = implode('', $堆疊);
$輸出[] = $字元;
$堆疊 = array();
}
} else {
$堆疊[] = $字元;
}
$前字 = $字元;
}
$輸出[] = implode('', $堆疊);
if ($快取) {
$this->快取[] = &$輸出;
end($this->快取);
$索引 = key($this->快取);
return $索引;
} else {
return $輸出;
}
}
function 代換($樣板, &$參數 = array()){
$堆疊 = array();
if (isset($this->快取[$樣板])) {
$解析 = &$this->快取[$樣板];
} else {
$解析 = $this->解析($樣板, false);
}
$索引 = 0;
foreach ($解析 as $字串) {
if (array_key_exists($字串, $this->解析表) && isset($參數[$索引])) {
$堆疊[] = call_user_func($this->解析表[$字串], $參數[$索引]);
$索引++;
} else {
$堆疊[] = $字串;
}
}
return implode('', $堆疊);
}
}
它可以載入一張函數表,根據這張函數表來對字串中的一些字元作轉換的動作,有點類似 sprintf 函數,不過每個字元的轉換可以自訂(這也就是函數表的功用)
class 字串解析 {
private $快取 = array();
private $解析表 = array();
private $例外字元 = '';
function 載入(&$解析表 = array(), $例外字元 = '', $取代 = true) {
if (mb_strlen($例外字元) < 2) {
$this->例外字元 = $例外字元;
}
if ($取代) {
$this->解析表 = array();
}
foreach ($解析表 as $字元 => $函數) {
if (mb_strlen($字元) == 1 && is_callable($函數)) {
$this->解析表[$字元] = $函數;
}
}
unset($this->解析表[$this->例外字元]);
$this->快取 = array();
}
function &解析($樣板, $快取 = true) {
$堆疊 = array();
$輸出 = array();
$前字 = ' ';
$長度 = mb_strlen($樣板);
for ($索引 = 0; $索引 < $長度; $索引++) {
$字元 = mb_substr($樣板, $索引, 1);
if (array_key_exists($字元, $this->解析表)) {
if ($前字 == $this->例外字元) {
array_pop($堆疊);
$堆疊[] = $字元;
} else {
$輸出[] = implode('', $堆疊);
$輸出[] = $字元;
$堆疊 = array();
}
} else {
$堆疊[] = $字元;
}
$前字 = $字元;
}
$輸出[] = implode('', $堆疊);
if ($快取) {
$this->快取[] = &$輸出;
end($this->快取);
$索引 = key($this->快取);
return $索引;
} else {
return $輸出;
}
}
function 代換($樣板, &$參數 = array()){
$堆疊 = array();
if (isset($this->快取[$樣板])) {
$解析 = &$this->快取[$樣板];
} else {
$解析 = $this->解析($樣板, false);
}
$索引 = 0;
foreach ($解析 as $字串) {
if (array_key_exists($字串, $this->解析表) && isset($參數[$索引])) {
$堆疊[] = call_user_func($this->解析表[$字串], $參數[$索引]);
$索引++;
} else {
$堆疊[] = $字串;
}
}
return implode('', $堆疊);
}
}
全站熱搜
留言列表