【发布时间】:2009-05-21 04:09:27
【问题描述】:
我正在尝试为它清理一些东西,并寻找一些更好的方法来解决它。这个想法是,我不想在我的规则中使用正则表达式来解析字符串,而是使用更接近路由语法“something/:searchitem/somethingelse”的东西,然后给出一个类似“/something/FOUNDIT/somethingelse”的字符串" 你会得到结果 "FOUNDIT"。
这是我正在重构的示例: 给定一个输入字符串,比如“http://claimid.com/myusername”。我希望能够针对许多可能的匹配项运行此字符串,然后为匹配的一个返回“myusername”。
运行它的数据可能如下所示:
PROVIDERS = [
"http://openid.aol.com/:username",
"http://:username.myopenid.com",
"http://claimid.com/:username",
"http://:username.livejournal.com"]
something_here("http://claimid.com/myusername") # => "myusername"
有什么好方法可以将http://claimid.com/myusername 之类的字符串与此列表匹配并理解结果吗?或者有什么技术可以让这样的事情变得更容易?我正在查看 rails 路由代码,因为它会执行类似的操作,但这不是最容易遵循的代码。
现在我只是用正则表达式来做这件事,但上面的方法似乎更容易阅读
PROVIDERS = [
/http:\/\/openid.aol.com\/(\w+)/,
/http:\/\/(\w+).myopenid.com/,
/http:\/\/(\w+).livejournal.com/,
/http:\/\/flickr.com\/photos\/(\w+)/,
/http:\/\/technorati.com\/people\/technorati\/(\w+)/,
/http:\/\/(\w+).wordpress.com/,
/http:\/\/(\w+).blogspot.com/,
/http:\/\/(\w+).pip.verisignlabs.com/,
/http:\/\/(\w+).myvidoop.com/,
/http:\/\/(\w+).pip.verisignlabs.com/,
/http:\/\/claimid.com\/(\w+)/]
url = "http://claimid.com/myusername"
username = PROVIDERS.collect { |provider|
url[provider, 1]
}.compact.first
【问题讨论】: