2010-05-23 2 views
0

Я делаю какую-то собственную систему шаблонов. Я хочу изменить"string"! = "String"

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

Выполнение функции «сайт» с параметром «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_array в call_user_func, потому что потом я буду использовать несколько аргументов.)

Edit:

STRLEN $, что - StrLen название 403 - 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(), чтобы избавиться от них. Если md5s разные, строки разные. var_dump(str_split($what)) выводит строковый символ char, если пробел не является вашей проблемой, возможно, это помогает.

1

Я попытался сравнить $ what (что для этого случая «title») с «title». MD5 разные.

Это означает, что $what не является «титулом». Вы должны положить в некоторых отладочных там:

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

Проверьте, нет никаких дополнительных пробелов или символов, которые вы не ожидали.

Смежные вопросы