2012-02-09 100 views
2

我正在使用ColdFusion 8.0.1。如何在URL中的isDefined()或structKeyExists()中使用通配符?

我寫的應用程序文件,將看URL一些代碼。如果任何特定類型的屬性通過,我不想更新SESSION結構中的屬性。

基本上,如果訪問者訪問具有與我們的註冊過程中做的任何網頁,我們不希望更新SESSION.UserInfo.ReturnToURL變量。對於他們訪問的每個其他頁面,我們想要更新該變量。

有與註冊過程中做的所有頁面都會有「myiq.reg」中的URL。如果是這種情況,我會使用下面的代碼。

// DETERMINE WHETHER TO UPDATE RETURNTOURL 
if (not structKeyExists(URL, "myiq.reg")) { 
    URLString = "http://" & CGI.SERVER_NAME & CGI.SCRIPT_NAME & CGI.QUERY_STRING; 
    SESSION.UserInfo.ReturnToURL = URLString; 
} 

但並非如此簡單。我的人都希望能夠通過類似於其他屬性,如:

myiq.reg_confirm 
myiq.reg_password 
myiq.reg_save 

我需要能夠柔軟這些代碼與他們在未來可能建立的任何註冊頁面工作。基本上,我需要這樣的東西:

if (not structKeyExists(URL, "myiq.reg*")) { 
    SESSION.UserInfo.ReturnToURL = URLString; 
} 

注意「myiq.reg」之後的WILDCARD。我試過這個,但它不起作用。

如何使這是與開頭的URL屬性訪問的任何頁面「myiq.reg」被忽略的代碼呢?

回答

8

你可以得到的URL範圍的structKeyList(),並且只是做一個正則表達式在找到。喜歡的東西:

reFindNoCase("(?:^|,)myiq\.reg", structKeyList(URL)) 

(只是表面測試)

你可以改善正則表達式一點,如果你想更精確地匹配真實變量名的模式,而不是僅僅在字符串中myiq.reg的任何事件。

+0

感謝您的信息! – 2012-02-17 16:15:44

1

像這樣的事情也許......

res = ''; 
params = StructKeyList(url); 
for(i=1; i lte ListLen(params); i++) { 
    param = listGetAt(params, i); 
    if (CompareNoCase(Left(param, 8), 'myiq.reg') eq 0) { 
    res = param; 
    break; 
    } 
} 
+0

謝謝,但這有點太冗長。 – 2012-02-17 16:16:15