下面这个正则表达式是进行替换的,可以正常运行    表达式:/<\{\s*\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*\}>/i
    替换串:<?php echo $this->fft_vars["${1}"]; ?>
    例:页面中放入这个“<{ $user }>|”,运行后可替换为“<?php echo $this->fft_vars["user"]; ?>”现我想修成这样替换:
    例:页面中放入这个“<{ $user[`id`] }>|”,运行后可替换为“<?php echo $this->fft_vars["user"]['id']; ?>”于是我修改了一下为:
    表达式:/<\{\s*\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)(\[\`([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)?\`\])\s*\}>/i
    替换串:<?php echo $this->fft_vars["${1}"]; ?>可运行结果确是:
    页面中放入“<{ $user[`id`] }>|”,运行后替换为“<?php echo $this->fft_vars["user"]; ?>”我的要求为如果$user后面没有[`id`]则替换为<?php echo $this->fft_vars["user"]; ?>,如果后面有[`id`],则这个[`id`]应替换成['id'],也就是中间的id不变,把[`和`]替换为['和'],请高手帮忙,谢谢

解决方案 »

  1.   

    php数组的hash性质,数组[]中可以是任何字符的,不需要对数组key限制是否为有效变量名
    参考
    $p = '/<\{\s*\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)((\[`[^`]+`\])*)\s*\}>/ie';$s = '<{ $user[`id`][`id2`][`id3`] }>|';echo preg_replace($p,"template_var('$1','$2','$3')",$s);function template_var( $_1,$_2)              
    {
            $_2 = str_replace(array('[`','`]'),array('["','"]'),$_2);
            return '<'.'?php echo $this->fft_vars["'.$_1.'"]'.$_2.'; ?'.'>';
    }
      

  2.   

    $p = '/<\{\s*\$([a-z0-9_]+)(?:\[`([a-z0-9_]+)`\])?\s*\}>/i';
    $s = '<{ $user[`id`] }>';
    echo preg_replace_callback($p,create_function ('$qs','$str=$qs[1];if(count($qs)==3){$str.=\'[\\\'\'.$qs[2].\'\\\']\';}return $str;'),$s);
    |这个是啥东西 只考虑了 a-zA-Z0-9_