2013-03-05 40 views
1

我有其中一個用戶進入一些電子郵件地址(強制性)和名(可選)文本區域。如何分割字符串以獲得電子郵件地址和名稱的數組(或散列),並考慮到它可能包含錯誤?到目前爲止,我可以把它分成數組,如果沒有名字被允許:拆分文本區域爲名字和電子郵件

emails = @request_feedback.emails.split("\r\n") 
emails.each {|email| 
    if (email =~ /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i) 
    FeedbackMailer.get_feedback(current_user, email, employee_id).deliver 
    end 
} 
+2

使用組您正則表達式如果允許用戶輸入數據以自由形式的方式,那麼確實沒有辦法可靠地捕獲電子郵件和名稱。正則表達式模式旨在查找文本中經常出現的模式,但它們可能沒有模式匹配的內容。沒有幾個文本樣本,我們無法幫助你,因爲我們可以想象完全不同的數據。 – 2013-03-05 14:52:15

+0

錫文是正確的。如果可能的話,大量考慮將你的文本區域重構爲離散的組。 – verbsintransit 2013-03-05 18:27:19

+0

我思考的內容分成地址和名稱的過程,它是一個後 - 行爲試圖將數據恢復到可用的格式的時候,相反,你需要修復您捕獲數據的方式。正如@verbsintransit所說,將您的文本區域重構爲離散的組。我會使用一個單獨的「輸入電子郵件:」文本輸入和一個「可選名稱:」文本輸入。用戶點擊「添加」按鈕,然後將數據聚合到JavaScript哈希中,並將它們添加到文本區域。用戶完成後,將散列作爲JSON字符串發送給您的代碼。問題解決了。 – 2013-03-05 18:52:50

回答

0

你需要使用括號

emails.each {|email| 
    if (email =~ /\A([\w+\-.]+)@([a-z\d\-.]+)\.[a-z]+\z/i) 
     FeedbackMailer.get_feedback($1, email, $2).deliver 
    end 
} 
+0

這個正則表達式無法接近實際地址。請參閱「[正則表達式使用與正則表達式濫用](http://www.codinghorror.com/blog/2005/02/regex-use-vs-regex-abuse.html)」和「[我知道如何驗證電子郵件地址,直到我讀了RFC(http://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address-until-i.aspx)」。 – 2013-03-05 17:59:29

+0

謝謝。我想我沒有準確地解釋我的問題。我不會讓他們隨機輸入地址和名稱。他們將有一個模式,即「電子郵件(名稱)」。我對正則表達式不是很有信心,需要幫助將text_area /字符串解析爲帶有可選名稱的電子郵件,並處理任何用戶輸入錯誤,即)) – grabury 2013-03-05 19:18:28

相關問題