मुझे आश्चर्य है कि जवाब में से कोई भी वास्तव में सही है (या रेल सहायक का उपयोग करके सीमित), हालांकि यह बहुत पुराना सवाल यह है कि कर रहा हूँ, इसलिए यहाँ समाधान है।
स्पष्ट रूप से यह निर्धारित करता है कि यह पहले लक्ष्य क्या है। हम स्ट्रिंग s
को 30 वर्णों में छंटनी करना चाहते हैं और आखिरी शब्द को भी कटौती करना चाहते हैं, अगर यह पूरी तरह से फिट नहीं हो सकता है। हम परिणाम से पिछली जगहों को छीनना चाहते हैं और टेक्स्ट को छोटा होने पर, इलिप्सिस जोड़ना चाहते हैं।
पाठ अब तो सीमित कर रहा है, तो छोटा है की तुलना में आसान
s[0,s.rindex(/\s/,30)].rstrip + '...'
अगर हम 30 वर्ण अधिकतम हो सकता है, की तुलना में यह से अंडाकार की लंबाई घटाकर के रूप में सरल है पूरे परिणाम चाहता था के रूप में 30. तो क्योंकि हम तीन बिंदु (और नहीं एक तीन-बिंदु चरित्र) की तुलना में हम
s[0,s.rindex(/\s/,27)].rstrip + '...'
जरूरत है और अंतिम परिणाम (परीक्षण है कि क्या हम सब पर काट-छांट करने की आवश्यकता के साथ) का उपयोग करें:
if s.length<=30
s
else
s[0,s.rindex(/\s/,27)].rstrip + '...'
end
यह बात करता है।
नोट: कुछ छायादार मामलों, कर रहे हैं जब वांछित परिणाम स्पष्ट नहीं है। यहाँ वे हैं:
- स्ट्रिंग रिक्त स्थान (
s= "Helo word "
) के बहुत सारे के साथ समाप्त होता है, लेकिन 30 की तुलना में कम रिक्त स्थान संरक्षित किया जाना चाहिए है? वर्तमान में वे हैं।
- उपर्युक्त जैसा ही है, लेकिन अंत में रिक्त स्थान सीमा 30 से अधिक है। (
s= "Twentyseven chars long text "
) की तरह - वर्तमान में सभी जगहों को अंत में हटा दिया गया है और इलिप्सिस जोड़ा गया है।
शुद्ध रूबी उत्तर के लिए धन्यवाद! पूरी तरह से काम किया। –
यह ज्यादातर लोग नहीं चाहते हैं। यह इलिप्सिस को इस बात पर ध्यान दिए बिना कि स्ट्रिंग वास्तव में 30 वर्णों से अधिक है या नहीं। – gamut
यह उत्तर किसी भी कारण से अंतिम शब्द को फेंक देता है, यहां तक कि इसकी आवश्यकता नहीं है। स्ट्रिंग नहीं होनी चाहिए "यह कुछ पाठ है जो वास्तव में है ..." अधिक अपेक्षित परिणाम हो? – gorn