“string”!=“string”

问题描述:

我正在做某种自己的模板系统。我想改变“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

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

您是否尝试过修剪空格?

$what = trim($what) 

也许有一个尾随/开始的空格字符。还要确保它们都是同样的套管:

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

您确定没有任何空格吗?使用trim()摆脱他们。如果md5不同,则字符串不同。 var_dump(str_split($what))将输出char字符串,如果一个空白不是你的问题也许这有助于。

我试图比较$什么(这是“title”这个例子)与“标题”。 MD5是不同的。

这将暗示$what不是“标题”。你应该在那里加入一些调试语句:

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

检查没有多余的空间或字符,你不期望。