模式匹配疑惑

Mosphere2016 2016-10-31 11:24:11
在php解析模板变量的时候有这么一个方法,如何改进使其能够支持解析数组,目前只支持非数据的单个变量
private function parVar()
{
$patter = '/\{\$([\w]+)(\[\'([\w]*)\'\])*\}/';
$repVar = preg_match($patter,$this->content);
if ($repVar) {
$this->content = preg_replace($patter,"<?php echo \$this->vars['$1']; ?>",$this->content);
}
}
...全文
698 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2016-10-31
  • 打赏
  • 举报
回复
这个不是头痛医头脚痛医脚的事情,需要综合考虑 否则这里成了,那里又出毛病
Mosphere2016 2016-10-31
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
你先确定模版变量的写法 然后再写解析代码
目前{$var['name']}也会解析成$this->vars[$var],期望是解析成$this->vars[$var]['name'],就是支持变量和数组的解析
Mosphere2016 2016-10-31
  • 打赏
  • 举报
回复
目前{$var['name']}也会解析成$this->vars[$var],期望是解析成$this->vars[$var]['name'],就是支持变量和数组的解析
xuzuning 2016-10-31
  • 打赏
  • 举报
回复
你先确定模版变量的写法 然后再写解析代码
Mosphere2016 2016-10-31
  • 打赏
  • 举报
回复
引用 10 楼 xuzuning 的回复:
所以我让你先把 模版变量的写法 先确定好 写程序时是不能无聊的预测用户将会怎么写的,那是规划时的事情
已经确定好了 {变量名},例如{$name}
xuzuning 2016-10-31
  • 打赏
  • 举报
回复
所以我让你先把 模版变量的写法 先确定好 写程序时是不能无聊的预测用户将会怎么写的,那是规划时的事情
Mosphere2016 2016-10-31
  • 打赏
  • 举报
回复
引用 8 楼 xuzuning 的回复:
private function parVar() { $patter = '/\{\$([\w]+)(\[\'([\w]*)\'\])*\}/'; $repVar = preg_match($patter,$this->content); if ($repVar == 1) { $this->content = preg_replace($patter,"<?php echo \$this->vars['$1']$2; ?>",$this->content); } }
这样只对一维数组才有效,多维数组就不对应了,有没有对单个变量,多维数组都能正确解析的写法,就是只替换变量名(包括变量和数组变量)例如: {$var}=>$this->vars[$var]; {$var['name']}=>$this->vars[$var]['name']; {$var['name']['address']}=>$this->vars[$var]['name']['address']
xuzuning 2016-10-31
  • 打赏
  • 举报
回复
private function parVar() { $patter = '/\{\$([\w]+)(\[\'([\w]*)\'\])*\}/'; $repVar = preg_match($patter,$this->content); if ($repVar == 1) { $this->content = preg_replace($patter,"<?php echo \$this->vars['$1']$2; ?>",$this->content); } }
Mosphere2016 2016-10-31
  • 打赏
  • 举报
回复
引用 6 楼 xuzuning 的回复:
你的正则匹配出 2 项 $patter = '/\{\$([\w]+)(\[\'([\w]*)\'\])*\}/'; 但处理时只使用了一项 $this->content = preg_replace($patter,"<?php echo \$this->vars['$1']; ?>",$this->content);
如何只替换匹配的第一项,保持后面的所有项都不变,例如由{$var['name']}得到$this->vars[$var]['name'],而不是$this->vars[$var]
xuzuning 2016-10-31
  • 打赏
  • 举报
回复
你的正则匹配出 2 项 $patter = '/\{\$([\w]+)(\[\'([\w]*)\'\])*\}/'; 但处理时只使用了一项 $this->content = preg_replace($patter,"<?php echo \$this->vars['$1']; ?>",$this->content);

4,250

社区成员

发帖
与我相关
我的任务
社区描述
国内外优秀PHP框架讨论学习
社区管理员
  • Framework
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧