2011-09-12 35 views
0

時々、私たちが渡しているURL文字列:のColdFusion URL変数問題

http://www.oursite.com/index.cfm?layout=displayNews&newsArticle=1837 

お知らせURLで"&"。これにより、受け取りページに問題が発生し、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> 

いずれのポインタも大変感謝しています。

答えて

4

cgの文字列を置き換えるi.query_stringは、URLスコープがその時点で設定されているため、問題を解決しません。

あなたは、構造体としての値を参照することができます。

<cfloop collection="#url#" item="key"> 
    <cfif left(key,4) eq "amp;"> 
     <cfset url[replace(key,"amp;","")] = url[key]> 
    </cfif> 
</cfloop> 

<cfif structkeyexists(url,'AMP;NEWSARTICLE')> 
    <cfset url.newsarticle = url['amp;newsarticle]> 
</cfif> 

これをさらに拡張し、あなたが全体のURLスコープをフィルタリングすることができます

<cfset url.newsarticle = url['amp;newsarticle']> 

のでstructKeyExistsがでていることコンバイン

+0

それはurl ['amp; newsarticle']でしょうか?あなたは閉じ角カッコの前に一重引用符を忘れたようです。 – user460114

+0

ありがとう、固定 - 私の手にbandaidと入力しようとしています:) –

+0

そして、それが常に同じパターンに従えば、それをあなたのApplication.cfcに組み込むこともできます –

0

あなたは

が-sean

0

きれいな方法があるかもしれません...

replaceNoCase(cgi.query_string, '&amp;', '&', 'all') 

は、それからちょうど..その方法は、唯一のHTMLエンティティが置き換えられます正常にそれを処理してみてください。 ..これは私のために働くようです(構文は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#" /> 
+0

私はほとんど同じ考えを持っているが、元のスコープに "パッチを当てて"変更を最小限に抑えることを好みます残りのコード。 mz_01が指摘しているように、これはApplication.cfcに置くことができ、コードはURLスコープが乱されていることを知らないでしょう:-) –

+0

どちらも正しいですが、URLスコープが正しく解析されないと終了する可能性がありますURLパラメータ名にガベージコレクションを追加する。状況に応じて、以下のショーンの推奨と組み合わせることができます。 –