如何在URL中的isDefined()或structKeyExists()中使用通配符?

时间:2012-02-09 15:40:58

标签: regex coldfusion

我正在使用ColdFusion 8.0.1。

我正在应用程序文件中编写一些代码来查看URL。如果传递了某种类型的属性,我不想更新SESSION结构中的属性。

基本上,如果访问者访问与我们的注册过程有关的任何页面,我们不希望更新SESSION.UserInfo.ReturnToURL变量。对于他们访问的每个其他页面,我们都想更新变量。

与注册过程有关的所有页面都会在URL中包含“myiq.reg”。如果是这种情况,我会使用下面的代码。

// 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。我试过这个,但它不起作用。

如何对此进行编码,以便忽略以“myiq.reg”开头的URL属性访问的任何页面?

2 个答案:

答案 0 :(得分:8)

您可以获取URL范围的structKeyList(),并在其中执行正则表达式查找。类似的东西:

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

(仅经过表面测试)

如果你想更准确地匹配实际的变量名模式而不是字符串中任何出现的myiq.reg,你可以稍微改进正则表达式。

答案 1 :(得分: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;
  }
}