2010-05-23 10 views
0

나는 일종의 템플릿 시스템을 만들고 있습니다. 내가 바꾸고 싶다"string"! = "string"

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

매개 변수 "title"을 사용하여 "site"실행 기능을 구현하십시오. 여기에 여기에

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_funccall_user_func_array을 변경할 수 없습니다.)

편집 :

STRLEN은 무엇 $ - (403) 나 strlen 제목 - 5 가 훗 - 보이는

위해서 var_dump

문자열 (403) " 제목"

+0

실제로 이것은 보안 허점이있는 소프트웨어 작성 방법입니다. – Ingo

답변

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

+0

아마 사이트의 많은 부분을 차단하지 않았기 때문에 내 정규식이 좋지 않을 수 있습니다. – Misiur

2

당신이 공백을 트리밍 시도?

$what = trim($what) 

어쩌면 뒤에/시작 공백 문자가 있습니다. 또한 모두 동등하게 처리해야합니다.

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

공백이 없습니까? 그들을 제거하려면 trim()을 사용하십시오. md5가 다른 경우 문자열이 다릅니다. var_dump(str_split($what))는 공백 문자가 문제가 아닐 수도있는 char 문자를 출력합니다.

1

나는 $ what (이 경우 "title")과 "title"을 비교하려고 시도했습니다. MD5는 다릅니다.

그러면 $what은 "제목"이 아닙니다. 다음 위치에 디버깅 문을 넣어야합니다.

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

예상하지 못한 여분의 공백이나 문자가 없는지 확인하십시오.

관련 문제