2010-05-23 142 views
0

我正在做某種自己的模板系統。我想改變「string」!=「string」

<title>{site('title')}</title> 

用函數「site」執行參數「title」。這裏的

private function replaceFunc($subject) 
{ 
    foreach($this->func as $t) 
    { 
     $args = explode(", ", preg_replace('/\{'.$t.'\(\'([a-zA-Z,]+)\'\)\}/', '$1', $subject)); 
     $subject = preg_replace('/\{'.$t.'\([a-zA-Z,\']+\)\}/', call_user_func_array($t, $args), $subject); 
    } 
    return $subject; 
} 

這裏的網站:

function site($what) 
{ 
    global $db; 
    $s = $db->askSingle("SELECT * FROM ".DB_PREFIX."config"); 

    switch($what) 
    { 
    case 'title': 
     return 'Title of page'; 
     break; 
    case 'version': 
     return $s->version; 
     break; 
    case 'themeDir': 
     return 'lolmao'; 
     break; 
    default: 
     return false; 
    } 
} 

我試過用 「標題」 來比較$what(這是這種情況下, 「標題」)。 MD5是不同的。 strcmp給出-1,「==」和「===」返回false。哪裏不對? ($what類型爲字符串,你不能改變call_user_func_arraycall_user_func,因爲後來我將使用多個參數。)

編輯:

strlen的$什麼 - strlen的標題 403 - 5 嘿 - 看起來像我沒有削減休息;)

的var_dump

串(403) 「 標題」

+0

順便說一句,這是一個如何寫軟件與安全漏洞。 – Ingo 2010-05-23 16:14:06

回答

2

MD5是不同的。 Strcmp給出-1, 「==」,「===」返回false。

扔在var_dump()strlen()

而且此功能特別困難的情況下:

function dump(&$str) { 
    $i=0; 
    while (isset($str[$i])) echo strtoupper(dechex(ord($str[$i++]))); 
} 
+0

+1:提「硬件」:) – Simon 2010-05-23 15:20:45

+0

也許我的正則表達式很糟糕,因爲它沒有切斷大部分網站。 – Misiur 2010-05-23 15:29:45

2

您是否嘗試過修剪空格?

$what = trim($what) 

也許有一個尾隨/開始的空格字符。還要確保它們都是同樣的套管:

$what = strtolower(trim($what)) //trim and lower 
2

您確定沒有任何空格嗎?使用trim()擺脫他們。如果md5不同,則字符串不同。 var_dump(str_split($what))將輸出char字符串,如果一個空白不是你的問題也許這有助於。

1

我試圖比較$什麼(這是「title」這個例子)與「標題」。 MD5是不同的。

這將暗示$what不是「標題」。你應該在那裏加入一些調試語句:

function site($what) { 
    var_dump($what); 
    die(); 
} 

檢查沒有多餘的空間或字符,你不期望。

相關問題