刚学习这个CMS,由于一个图片的问题,需要用到{$IF }
[loop=1]
<img src="{$IF("{@photourl}}" alt=""/>
<h4><a href="{@linkurl}" target="_blank">{@title}</a></h4>
<p>{@intro}…<a href="{@linkurl}" target="_blank">[阅读]</a></p>
[/loop]
测试发现:
无论如何{$IF("{@photourl}}都输出:
{{@photourl}}{/images/11.png}{/$IF}
郁闷阿!
查看代码发现处理{$IF}使用了两个函数,这两个函数的原形:
Function DoIf(byval condition,byval yes,byval no)
if(Eval(condition)) then DoIf=yes else DoIf=no
end function
'增加的代码 使用标签格式 {$IF 1=1 } {True} {False} {/$IF} 按照以下的正则 是不允许在条件分支中出现大括号内容的
'使用举例如 {$IF {@autoid} mod 2=0 } {</tr><tr>} {{$IF {@autoid}=1 }{<font color="Red">第一名</font>}{}{/$IF}} {/$IF} 这个是说明 使用中这个例子中的第二级IF应该是用不到吧呵呵
'条件中的判断格式: 原来asp该怎么写就怎么写
Function ParseIF(sTemplate)
dim condition,yes,no
'sTemplate=replace(sTemplate,"!","$")
regEx.Pattern = "\{\$IF([^\}]*)\}[^\{]*\{([^\}]*)\}[^\{]*\{([^\}]*)\}[^\{]*{/\$IF\}"
Set Matches = regEx.Execute(sTemplate)
On Error Resume Next
'不断的检查自身 用来替换嵌套的IF
dim n:n=0
do while(Matches.Count<>0)
set Match=Matches(0)
condition=Match.SubMatches.Item(0)
yes=Match.SubMatches.Item(1)
no=Match.SubMatches.Item(2)
sTemplate=replace(sTemplate,Match.Value,DoIf(condition,yes,no))
set Matches=regEx.Execute(sTemplate)
n=n+1
if n>=5 then exit do
loop
set Matches=nothing
ParseIF=sTemplate
end Function
调试:
当运行到 parseif(templates)这个函数时,标签文本变为:
<img src="{$IF("{@photourl}}" alt=""/>
<h4><a href="此处正常已替换 target="_blank">此处正常已替换</a></h4>
<p此处正常已替换…<a href="此处正常已替换" target="_blank">[阅读]</a></p>
绿色的部分不见了
问题不出现在替换函数的本身,在函数ParseIF(sTemplate)
前的处理过程中就丢失了条件部分,造成正则不匹配,懒得去查找错误处,我很懒。。哈哈,修改正则表达式,规避替换问题解决。谁有兴趣查找错误的,交流一下。