有时我们传递的url字符串如下:
http://www.oursite.com/index.cfm?layout=displayNews&newsArticle=1837
注意网址中的"&"
。这会导致接收页面出现问题,该页面将url变量视为url.AMP;newsArticle
我们无法始终控制它是以这种方式到达还是“&”。
在接收页面中,我们想要处理这两种格式可能到达的可能性。我做了一些不起作用的弱尝试,例如。
<cfif structkeyexists(url,'AMP;NEWSARTICLE')>
<cfset url.newsArticle = evaluate('#url.AMP;NEWSARTICLE#')> <!--- this line errors on the semicolon after AMP --->
</cfif>
任何指针都非常感激。
答案 0 :(得分:4)
替换cgi.query_string中的字符串无法解决问题,因为此时填充了URL范围。
您可以将该值引用为结构:
<cfset url.newsarticle = url['amp;newsarticle']>
所以将它与structKeyExists结合使用:
<cfif structkeyexists(url,'AMP;NEWSARTICLE')>
<cfset url.newsarticle = url['amp;newsarticle]>
</cfif>
进一步扩展,您可以过滤掉整个网址范围:
<cfloop collection="#url#" item="key">
<cfif left(key,4) eq "amp;">
<cfset url[replace(key,"amp;","")] = url[key]>
</cfif>
</cfloop>
答案 1 :(得分:0)
您可以尝试
replaceNoCase(cgi.query_string, '&', '&', 'all')
然后只是正常处理..那样只有html实体被替换......
-Sean
答案 2 :(得分:0)
可能有一种更清洁的方式......但这似乎对我有用(语法假设为CF9):
<cfscript>
cleanURL = {};
for ( var item in URL ) {
if ( left( item, 4 ) == "amp;" ) {
key = replaceNoCase( item, 'amp;', '' ); // right() also works here
} else {
key = item;
}
cleanURL[ key ] = URL[ item ];
}
</cfscript>
<cfdump var="#cleanURL#" />