3

文字列として保存された URL から特定の URL 変数キー値を解析したいと考えています。基礎となる Java ライブラリの coldfusion.util.HTMLTools を ACF で使用できるようですが、Railo でも動作させる必要があります。別の方法はありますか、それとも正規表現を使用するのが最善の答えですか?

次の例のようにフォーマットされた URL で、アンカーなしで URL 変数キーの値を取得しようとしています。 http://example.com?key=134324625625435#gid=0

4

3 に答える 3

9

スコットの回答にコメントとして投稿していましたが、長くなりすぎたので...

ジョンは次のように書いています。

次の例を実行すると、値が 0 になりますが、それはキー値全体であるべきだと思いますか?

<cfoutput>
    <cfset theUrl = "https://docs.google.com/spreadsheet/ccc?key=0AthiZNZ73LBndUzRTUkplbmNhYWc##gid=0" />
    <cfset theUrl = listRest(theUrl, "?")>
    <cfloop list="#theUrl#" index="URLPiece" delimiters="&">
        Key: #listFirst(urlPiece, "=")# Value: #listLast(urlPiece, "=")# <br />
    </cfloop>
</cfoutput>

この例の URL が失敗する理由は、ページ セグメント (ハッシュの後のビット) が含まれているためです。これは、クエリ文字列を解析する前に取り除く必要があります。

キー/値の部分を でラップして、正しい変数/値を取得することも重要ですUrlDecode

さらに、値に等号を含めることは完全に許容されるため、値として?key==返す必要があります。=つまり、ListLastを aに変更し、trueListRestに設定includeEmptyFieldsします。

また、次のようなクエリ文字列がある場合?a&b、値をどちらかtrueまたは空の文字列に設定するのが慣例です。現在のコードはキー名に設定されていますが、これは間違っています。

要約すると、ここに関数があります:

<cffunction name="getParamsFromUrlString" returntype="Struct" output=false >
    <cfargument name="UrlString" type="String" required />
    <cfargument name="Separator" type="String" default="?" />
    <cfargument name="Delimiter" type="String" default="&" />
    <cfargument name="AssignOp"  type="String" default="=" />
    <cfargument name="EmptyVars" type="String" default="" />

    <cfset var QueryString = ListRest( ListFirst( Arguments.UrlString , '##' ) , Arguments.Separator ) />
    <cfset var Result = {} />

    <cfloop index="local.QueryPiece" list=#QueryString# delimiters="#Arguments.Delimiter#">

        <cfif NOT find(Arguments.AssignOp,QueryPiece)>
            <cfset Result[ UrlDecode( QueryPiece ) ] = Arguments.EmptyVars />
        <cfelse>
            <cfset Result[ UrlDecode( ListFirst(QueryPiece,Arguments.AssignOp) ) ]
                =  UrlDecode( ListRest(QueryPiece,Arguments.AssignOp,true) ) />
        </cfif>
    </cfloop>

    <cfreturn Result />
</cffunction>

次のように簡単に使用できます。

    <cfset theUrl = "https://docs.google.com/spreadsheet/ccc?key=0AthiZNZ73LBndUzRTUkplbmNhYWc##gid=0" />
    <cfset Data = getParamsFromUrlString( theUrl ) />
    <cfdump var=#Data# />

または、次のような複雑な非標準の URL 文字列で使用できます。

    <cfset theUrl = "https://somewhere/index.jsp;x:145;y:54;z:1;f;d:%23%23;w:%3B" />
    <cfset Data = getParamsFromUrlString( theUrl , ';' , ';' , ':' , 'true' ) />
    <cfdump var=#Data# />

そして(うまくいけば)その間のすべて。

于 2012-04-23T13:38:13.600 に答える
4

クエリ文字列の一部として渡される変数はすべて、「組み込み」構造である URL スコープで使用できます。

これらの変数を例に出力するサンプルコードを次に示します。

<cfoutput>
    #url.id# <br />
    #url.key# <br />
    #url.output#
</cfoutput>

新しい情報とmbruscheの例に一致するように私の答えに追加します:

<cfset urlString = listRest( urldata, "?" ) />
<cfoutput>
    <cfloop list="#urlString#" index="URLPiece" delimiter="&">
        Key: #listFirst( urlPiece, "=" )# Value: #listLast( urlPiece, "=" (# <br />
    </cfloop>
</cfoutput>
于 2012-04-19T03:22:18.647 に答える
2

質問を読み直したところ、単一の特定の変数のみを扱っている場合は、単純な正規表現を使用して簡単にこれを行うことができます。

<cfset Value = rematch( '[?&]key=[^&##]+' , TheUrl ) />
<cfset Value = UrlDecode( ListRest( Value[1] , '=' , true ) ) />

(もちろん、より汎用的なソリューションが必要な場合は、他の答えも役立ちます。)

于 2012-04-23T13:50:59.133 に答える