我正在嘗試清理它的地獄,並尋找一些更好的方法去實現它。我的想法是,我不想在我的規則中使用正則表達式來解析字符串,而是使用更接近路由語法「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
太棒了,效果很棒!很少的代碼和更容易閱讀。 – AdamFortuna 2009-05-22 02:13:47