2012-02-09 81 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

相关问题