+ -
当前位置:首页 → 问答吧 → 关于TP中点语法使用时无法解析问题的解决方案

关于TP中点语法使用时无法解析问题的解决方案

时间:2011-06-29

来源:互联网



曾记得当初在用TP做项目的时候,很多时候点语法根本就没有被解析,今天有个同事又遇到了这个问题。
今天来刨了到底是什么原因?
我同事的代码是这样子的:<if condition="$res.test neq $arr.tid">....
这样写系统无法解析。系统解析后的条件是:$res['test'] != $arr.tid;
后面的表达是么有被解析,原因如下:
在文件Tablib.class.php文件的第151和154行的代码有点不正确
  1. $condition = preg_replace('/\$(\w+)\.(\w+)\s/is','$\\1["\\2"] ',$condition);
复制代码
个人感觉应该改成
  1. $condition = preg_replace('/\$(\w+)\.(\w+)\s?/is','$\\1["\\2"] ',$condition);
复制代码
那么这样子的话,就能解析上面的点语法了。
但是这样子同样存在问题,举个例子:如果用户将条件写成了<if condition="$res.testneq $arr.tid">....
这个样子,那么系统会解析成$res['testneq'] $arr.tid这个样子了 ,同样也是出现了错误。但是我跟人感觉出现这样子的错误概率比较小,通常大家都知道在neq两边有个空格,所以我感觉修改原有的正则为我的那个比较有效,出现的错误的概率比较低,及时出现错误,用户也会很快就发现了。其次还有个解决方法,那就是在条件语句的最后一个变量写完之后添加一个空格如:
<if condition="$res.test neq $arr.tid ">....
那么这样子系统也会识别点语法。
总结:
解决点语法不能被解析的方法(这里只是针对我出现的这个例子,可能有些例子还需要修改其他地方)
方法1:修改正则表达式为我上述的:
  1. $condition = preg_replace('/\$(\w+)\.(\w+)\s?/is','$\\1["\\2"] ',$condition);
复制代码

方法2:在条件语句结束的双引号之前价格空格如:<if condition="$res.test neq $arr.tid  ">
以上仅是个人观点,如有不足之处,请大家指教。

作者: binbin   发布时间: 2011-06-29

数组变量可以使用点语法。 你也可以使用原本的数组形式,并非必须用点语法。
比如 {$arr.key} 我们也可以写成{$arr['key']}
ThinkPHP 并非所有地方可以使用点语法。 能使用点语法的只有 两个地方。
1,变量标签:{$arr.key} 花括号开始的变量。但是这样 是不对的 {$arr[$arr2.key]}  因为 $arr2 变量 不是花括号开始。

2,name属性值, 如 <volist id='vo' name='arr.key'>  再如<eq name="arr.key" value="xxx">  但是这样是不对的 <volist id='vo' name="arr[arr2.key]">

作者: luofei614   发布时间: 2011-06-30

这两点我都知道
呵呵。。

作者: binbin   发布时间: 2011-06-30