ColdFusion中带空格的<cfcase>值匹配失败问题求助
解决ColdFusion 带空格值匹配失败的问题
我之前确实碰到过一模一样的问题!ColdFusion的<cfcase>在匹配带空格的字符串时,很容易因为解析后的内容存在隐形空白字符(比如多个空格、制表符,甚至是HTML转义的 )导致匹配失效,就像你遇到的"LGT RAIN"无法被识别的情况。
下面分享几个我用过的有效解决方案:
方案1:预处理字符串,移除所有空白字符
这是最直接的办法,把解析来的天气值里的空格(包括所有空白字符)都去掉,统一成无空格的格式再匹配:
<!--- 假设这是从HTML解析得到的天气值 ---> <cfset rawWeather = parsedHTML.weatherCondition> <!--- 先处理可能的HTML转义空格,再移除所有空白字符 ---> <cfset cleanedWeather = REReplace(Replace(rawWeather, " ", " ", "ALL"), "\s+", "", "ALL")> <cfswitch expression="#cleanedWeather#"> <cfcase value="LGTRAIN"> <p>当前天气:小雨(LGT RAIN)</p> </cfcase> <cfcase value="HEAVYRAIN"> <p>当前天气:大雨(HEAVY RAIN)</p> </cfcase> <cfdefaultcase> <p>未知天气:#rawWeather#</p> </cfdefaultcase> </cfswitch>
这里用REReplace配合正则\s+可以一次性替换所有空白字符(空格、换行、制表符等),比单纯替换单个空格更稳妥。
方案2:直接匹配带空格的值,但确保字符串完全一致
如果你不想修改原始值,也可以直接在<cfcase>里写带空格的内容,但一定要先对解析后的字符串做首尾去空白处理,避免首尾的隐形空格干扰:
<cfset rawWeather = Trim(parsedHTML.weatherCondition)> <cfswitch expression="#rawWeather#"> <cfcase value="LGT RAIN"> <p>当前天气:小雨</p> </cfcase> <cfcase value="HEAVY RAIN"> <p>当前天气:大雨</p> </cfcase> <cfdefaultcase> <p>未匹配到天气类型:#rawWeather#</p> </cfdefaultcase> </cfswitch>
如果遇到解析后的字符串有多个连续空格,还可以先用REReplace(rawWeather, "\s+", " ", "ALL")把多个空格替换成单个空格,再做Trim。
方案3:Switch前先做条件判断预处理
如果你的天气类型不多,也可以在进入Switch之前先判断特定值,提前转换格式:
<cfset rawWeather = parsedHTML.weatherCondition> <cfset processedWeather = rawWeather> <!--- 针对特定带空格的天气值做转换 ---> <cfif rawWeather eq "LGT RAIN"> <cfset processedWeather = "LGTRAIN"> <cfelseif rawWeather eq "HEAVY RAIN"> <cfset processedWeather = "HEAVYRAIN"> </cfif> <cfswitch expression="#processedWeather#"> <cfcase value="LGTRAIN"> <!--- 小雨处理逻辑 ---> </cfcase> <cfcase value="HEAVYRAIN"> <!--- 大雨处理逻辑 ---> </cfcase> </cfswitch>
额外注意点
- 解析HTML时,一定要确认天气值里的空格是普通空格还是
(HTML非断行空格),如果是后者,必须先替换成普通空格再处理,否则匹配肯定失败。 - 可以用
WriteDump(rawWeather)输出原始值,查看是否有隐形字符,方便排查问题。
内容的提问来源于stack exchange,提问作者WSC27
相关产品推荐
相关产品推荐

