相信有很多朋友还不知道,可以在smarty模板里调用php的内置函数,我们一起来看看它的用法。
模板书写:
{'param1'|functionName:'param2':'param3'}
php函数原型:
echo functionName('param1','param2','param3');
实例:
{'1234567'|substr:'1':'2'}
下面这个和函数的参数顺序有关系
{'a'|str_replace():'A':'abcd'}
直接延伸到,直接在php中写一个函数调用,不需要注册修改器的.
更深一步的研究:发现数组会出错.
分配了一个数组array给Smarty,假设Smarty的分界符为'{' 和'}'。
在很多资料上都看到,在Smarty中要求数组的长度时,可以用在数组后便加|count的方法调用。即通过{array|count}获得 array的长度。但是今天在写模板时,发现这样得不到数组的长度,而只是得到一个返回的字符串Array。也就是说仅仅是返回了{array}的结果, 而没有返回其array的长度。
查看smarty\plugins文件夹,发现并没有count的相关方法,也就是说,count是直接调用了php中的方法。
后来通过网络上的资料,发现可以在count前面加@,从而正确的获取数组的长度。再进一步查看Smarty的源码,发现Smarty对属性调节器后边的 方法名进行处理时,会对前边加@的进行特殊处理。因此作出判断:在Smarty中的属性调节器中调用php中定义好的函数时,可以通过加@来表示。
1、对类型为数组的方法进行测试时,发现不加@符号都会出错。比如:要对一个数组调用count方法求出数组的长度,就可以这样调用{array|@count},而要对数组调用end方法得出数组的最后一组数据时,则可以通过{array|@end}。
2、在对字符串的相关函数进行测试,发现加不加@都可以正常的调用。
3、其他的尚未认真测试。
对于在smarty中调用复杂的php函数不予鼓励,因为Smarty的本意就是要实现代码和模板分离,不要偏离了人家的设计初衷。
模板书写:
{'param1'|functionName:'param2':'param3'}
php函数原型:
echo functionName('param1','param2','param3');
实例:
{'1234567'|substr:'1':'2'}
下面这个比较怪 和函数的参数顺序有关系
{'a'|str_replace:'A':'abcd'}
Smarty调用自定义函数
调用自定义函数需要用到register_function() 来注册
这里为大家举个例子,常见的字符串切割
函数如下
function SmartyLen($params){
extract($params);
$len=strlen($text);
$max=$length;
for ($i=0;$i<$length;$i++){
$chr=substr($text,$i,1);
if(ord($chr)>0x80)//字符是中文
{
$length++;
$i++;
$len--;
}
}
$str=substr($text,0,$length);
if($len>$max)$str.="...";
Return $str;
}
注册函数
$smarty->register_function('len',"SmartyLen");
模板调用
{len text="测试下" length="1"} //注意这里的text和length其实是函数里的2个参数函数的参数必须要以函数内部变量名一致,其实传回去的的是个数组,在函数里用extract($params);把数组中的变量导入到当前的符号表。
在php中分割一个字符串,我们可以使用函数explode()(),其原型如下。
array explode (string $separator, string $string [, int $limit])
该函数有3个参数,第一个参数$separator设置一个分割字符(串)。第二个参数$string指定所要操作的字符串。$limit参数是可选的,指定最多将字符串分割为多少个子串。
该函数返回一个由被分割的子串组成的数组。
来看下面的例子,对一个由逗号分隔的多行文本数据进行分析。
例1,分割字符串。
<?php
$this_year = 2013;
$text = <<< EOT
祝无双,F,1982,广东,普遍职员
李三兵,M,1981,河北,普通职员
赵朴秀,F,1980,韩国,项目经理
EOT;
$lines = explode("\n", $text); //将多行数据分开
foreach ($lines as $userinfo) {
$info = explode(",", $userinfo, 3); //仅分割前三个数据
$name = $info[0];
$sex = ($info[1] == "F")? "女" : "男";
$age = $this_year - $info[2];
echo "姓名: $name $sex . 年龄:$age <br/>";
}
/* 输出结果是:
姓名:祝无双 女 年龄:31
姓名:李三兵 男 年龄:32
姓名:赵朴秀 女 年龄:33
*/
?>
以上代码,先对文本按行进行分割,然后将每行字符串按","进行分割,并取前三个数据进行处理分析,然后进行整理并输出。
另外,为大家介绍php的另一个内建函数implode(),用于连接数组成为字符串。
与分割字符串函数相对应的是implode()函数,它的别名函数叫做join(),函数原型分别如下。
string implode(string $glue, array $pieces)
string join(string $glue, array $pieces)
implode()或join()函数可以将数组$pieces中的元素用指定的字符$glue连接起来。
下面为大家举一个简单的例子,供学习参考。
例2:
$fruits = array('apple', 'banana', 'pear');
$str = implode(", ", $fruits);
echo $str;
?>
介绍:preg_replace 执行正则表达式的搜索和替换,如果只是单纯的匹配字符串建议使用str_replace()(),因为其执行效率高的多。
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])
在 subject 中搜索 pattern 模式的匹配项并替换为 replacement。如果指定了 limit,则仅替换 limit 个匹配,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换。
参照之前说过的 php用preg_match_all匹配文章中的图片 ,下面给出匹配图片并加上链接的代码:
$con = file_get_contents("http://www./wzjs/");
$pattern="/<[img|IMG].*?src=/blog_article/[/index.html'|\"](.*?(?:[\.gif|\.jpg|\.png]))[\'|\"].*?[\/]?>/";
$new_con = preg_replace($pattern,"<a href='/blog_article/$1/index.html'>$0</a>",$con);
echo $new_con;
?>
说明:$0表示这个匹配内容,$1表示第一个()匹配的内容 $2表示第二个()匹配的内容,以此类推!
这样就给图片加上链接了,感兴趣的朋友不妨自己动手测试下哦。
您可能感兴趣的文章:
php匹配图片地址的代码一例
PHP正则匹配日期和时间(时间戳转换)的例子
php匹配任何网址的正则表达式
php正则匹配重写html图片img路径的代码一例
PHP正则匹配获取URL中域名的代码
php用preg_match_all匹配文章中的图片
php正则表达式匹配URL中的域名