在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}>
大意是:
比如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}>
<{section name=lparr loop=$arr}>
<{$arr[lparr].2|regex_replace:"/rep_quo_([0-9]+)/ie":"$arr[\$1].2"}>
<br>
<{/section}>
我模板里用你这个写法,但是输出 是
c
g
k
o
s
Array[3].2 按照我上面的要求,输出结果应该是c
g
k
o
s
o最后那个O也就是前面第4(基数从0开始)个O
<{$arr[lparr].2|regex_replace:"/rep_quo_([0-9]+)/i":$arr[3].2}>
如何把那后面的3替换成正则匹配项 $1??
/**
* 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;
}
里面还要考虑到删除楼层、楼层支持和反对等很多问题。smarty应该也许能完成,不过花大量的精力在这上面,有点分不清轻重了。
本来怕会影响SEO,所以不想用JS,后来一想,引用的内容是已经出现过的,所以还是用JS了。不过如果客户端禁用了JS的话,(一般人应该不会),显示出来的就是我自己定义的代码了。象DZ那样的代码。
再次表示感谢。结贴。