在section循环中,我用了regex_replace函数替换。
大意是:
比如section一共有十个循环。我在第五个循环中,本来,应该输出 rep_quo_3,但是,我需要将这个 rep_quo_3 替换成,第三个循环中所输出的内容。也就是rep_quo_(这个数字)。
于是,我以为我可以这样写:
<{$comments2[lpcomments].2|regex_replace:"/rep_quo_([0-9]+)/i":$comments2["\$1"].2}>
结果smarty不编译。如果把后面那个双引号放在外面"$comments2[\$1].2",能取到$1的值,但是comments2成了array
如果我这样写:<{$comments2[lpcomments].2|regex_replace:"/rep_quo_([0-9]+)/i":$comments2[2].2}>
可以正常输出。但是,后面那个中括号里的数字不能是固定的,应该是前面正则匹配出来的值。
经测试,正则可以取出那个数字,$comments2[2].2 也能输出期望的内容。但是,把正则所匹配的值和smarty的这个变量混在一起,就不行了。 试过很多很多种写法,都不可以。麻烦弄过这个的朋友,能告之小弟该怎样写。
谢谢。
为测试方便,我专门写了2个文件,贴下代码:
PHP的代码:<?php
require 'libs/Smarty.class.php';
$tpl = new Smarty();
$tpl->template_dir =  "/templates/default/";
$tpl->compile_dir =  "templates_c/";
$tpl->left_delimiter = "<{";
$tpl->right_delimiter = "}>";
$tmp=array(
0=>array("a","b","c","d"),
1=>array("e","f","g","h"),
2=>array("i","j","k","l"),
3=>array("m","n","o","p"),
4=>array("q","r","s","t"),
5=>array("u","v","rep_quo_3","x"),
);
$tpl->assign("arr",$tmp);
$tpl->display('reg_replace.html');
?>
模板的代码:
<{section name=lparr loop=$arr}>
<{$arr[lparr].2|regex_replace:"/rep_quo_([0-9]+)/i":"$arr[\$1].2"}>
<br>
<{/section}>

解决方案 »

  1.   

    可尝试加个 e
    <{section name=lparr loop=$arr}>
        <{$arr[lparr].2|regex_replace:"/rep_quo_([0-9]+)/ie":"$arr[\$1].2"}>
        <br>
    <{/section}>
      

  2.   

    谢谢楼上朋友。
    我模板里用你这个写法,但是输出 是





    Array[3].2 按照我上面的要求,输出结果应该是c 




    o最后那个O也就是前面第4(基数从0开始)个O
      

  3.   

    问题可以简化成一句话模板里的代码:
    <{$arr[lparr].2|regex_replace:"/rep_quo_([0-9]+)/i":$arr[3].2}>
    如何把那后面的3替换成正则匹配项 $1??
      

  4.   

    测试了几次,好象没则,$arr[3].2都要用具体的数字来代表无法用引用$1,之类的。
      

  5.   

    因为smarty不支持正则的e修饰符,所以上面应该行不通
    /**
     * Smarty regex_replace modifier plugin
     *
     * Type:     modifier<br>
     * Name:     regex_replace<br>
     * Purpose:  regular expression search/replace
     * @link http://smarty.php.net/manual/en/language.modifier.regex.replace.php
     *          regex_replace (Smarty online manual)
     * @author   Monte Ohrt <monte at ohrt dot com>
     * @param string
     * @param string|array
     * @param string|array
     * @return string
     */
    function smarty_modifier_regex_replace($string, $search, $replace)
    {
        if(is_array($search)) {
          foreach($search as $idx => $s)
            $search[$idx] = _smarty_regex_replace_check($s);
        } else {
          $search = _smarty_regex_replace_check($search);
        }       
    $search = '/rep_quo_([0-9]+)/ie';
        return preg_replace($search, $replace, $string);
    }function _smarty_regex_replace_check($search)
    {
        if (($pos = strpos($search,"\0")) !== false)
          $search = substr($search,0,$pos);
        // 这里已经将e修饰符给替换掉了,所以xuzuning大大的那个方式不可以,如果这里给修改一下就可以了
        if (preg_match('!([a-zA-Z\s]+)$!s', $search, $match) && (strpos($match[1], 'e') !== false)) {
            /* remove eval-modifier from $search */
            $search = substr($search, 0, -strlen($match[1])) . preg_replace('![e\s]+!', '', $match[1]);
        }
        return $search;
    }
      

  6.   

    感谢各位的帮助。经过一天的测试,我最终还是换用JS了。
    里面还要考虑到删除楼层、楼层支持和反对等很多问题。smarty应该也许能完成,不过花大量的精力在这上面,有点分不清轻重了。
    本来怕会影响SEO,所以不想用JS,后来一想,引用的内容是已经出现过的,所以还是用JS了。不过如果客户端禁用了JS的话,(一般人应该不会),显示出来的就是我自己定义的代码了。象DZ那样的代码。
    再次表示感谢。结贴。