2009-04-08 13 views
5

मैं trim() की तरह कुछ ढूंढ रहा हूं लेकिन स्ट्रिंग की सीमाओं के भीतर। उपयोगकर्ता कभी-कभी टाइप करते समय 2, 3, 4, या अधिक लाइन रिटर्न डालते हैं, मुझे इस इनपुट को स्वच्छ करने की आवश्यकता है।अत्यधिक लाइन रिटर्न हटाएं

नमूना इनपुट

i like cats 


my cat is happy 
i love my cat 



hope you have a nice day 

वांछित उत्पादन

i like cats 

my cat is happy 
i love my cat 

hope you have a nice day 

मैं में बनाया कुछ भी नहीं दिखाई दे रहा है, और एक स्ट्रिंग इसके बारे में कई पुनरावृत्तियों ले काम करने के लिए होता है की जगह। इससे पहले कि मैं एक छोटी रिकर्सिव स्ट्रिंग को प्रतिस्थापित कर दूं, मैं देखना चाहता था कि आपके पास अन्य सुझाव क्या हैं।

मुझे एक अजीब लग रहा है कि इसके लिए एक रेगेक्स भी है।

उत्तर

3

अंत में इसे पाने में कामयाब रहे, तो preg की जरूरत है आप php में PCRE संस्करण का उपयोग कर रहे हैं, और भी एक \ n \ n प्रतिस्थापन स्ट्रिंग की जरूरत है आदेश में सभी लाइन अंत लेकिन एक पोंछ नहीं करने के लिए:।

$body = preg_replace("/\n\n+/", "\n\n", $body); 

सही रास्ते पर मुझे रहने के लिए धन्यवाद

+0

शायद आपको स्वीकृत उत्तर (थर्कुन) का चयन करना चाहिए ताकि यह प्रश्न उत्तर के रूप में चिह्नित किया जा सके (और अनुत्तरित कतार से बाहर निकाला गया हो)। – Calvin

3

आपको इसे करने के लिए कितना टेक्स्ट चाहिए? तो इसके बारे में 100k से कम है तो आप शायद सिर्फ एक सरल खोज दूसरी ओर यदि आप डेटा की मेगाबाइट के माध्यम से जाने की जरूरत है इस्तेमाल कर सकते हैं और regex की जगह (/\n+/ की तरह खोजने कुछ और \n के साथ बदलें)

, तो आप कर सकते थे चरित्र द्वारा पाठ चरित्र को पार्स करें, आउटपुट में इनपुट की प्रतिलिपि बनाएँ, सिवाय इसके कि जब मल्टीप्ल न्यूलाइन का सामना किया जाता है, तो इस मामले में आप केवल एक नई लाइन कॉपी करेंगे और बाकी को अनदेखा करेंगे।

हालांकि मैं एक रिकर्सिव स्ट्रिंग को प्रतिस्थापित करने की अनुशंसा नहीं करता हूं, ऐसा लगता है कि यह बहुत धीमा होगा। एकल पंक्ति विराम है, जो अपनी परिभाषा से ठीक हैं अनदेखा करते हुए

+0

अधिक नहीं, एक ईमेल जो ईमेल में भेजता है उसके लिए एक ईमेल, यह एक वेब सिस्टम का हिस्सा है। –

10
function str_squeeze($body) { 
    return preg_replace("/\n\n+/", "\n\n", $body); 
} 
+0

यह तर्कों में 'टू "बदलने के बाद, सभी पंक्तियों को एक से अलग करता है। –

+0

ए (थोड़ा) अधिक सुव्यवस्थित रेगेक्स इस तरह दिखेगा: preg_replace ("/\ n {2,}/"," \ n \ n ", $ body); – KOGI

+0

धन्यवाद कोजी। सुव्यवस्थित, ठीक है, यह थोड़ा अधिक कोड है। क्या यह तेज़ है? – markus

2

निम्नलिखित नियमित अभिव्यक्ति कई लाइनब्रेक निकाल देना चाहिए:

ereg_replace("\n\n+", "\n\n", $string); 

आप इस PHP Regular Expression test tool है, जो बहुत आसान है के साथ यह परीक्षण कर सकते हैं (लेकिन के रूप में यह PHP के साथ सही समानता में नहीं लगता है)।

[संपादित करें] फिक्स्ड 'करने के लिए ", वे काम करने के लिए लग रहे हैं के रूप में नहीं था स्वीकार करने के लिए मैं सिर्फ वेब उपकरण में regex का परीक्षण किया है;।।)

+0

मुझे तब तक कोई परिणाम नहीं मिला जब तक कि मैंने अभिव्यक्ति में 'ए "को बदल दिया और प्रतिस्थापित नहीं किया। फिर यह काम करता है, लेकिन \ n \ n –

+0

मारता है कि regex लिया php के साथ सही समानता में नहीं है। मैं एक समाधान की खोज जारी रखूंगा। –

3

सभी तीन लाइन ब्रेक दृश्यों पर विचार करने के लिए:

preg_replace('/(?:\r\n|[\r\n]){2,}/', "\n\n", $str) 
+0

धन्यवाद, मैं preg_replace ("/ \ n \ n + /", "\ n \ n", $ body) चलाने से पहले एक लाइन एंडिंग यूनिफायर चलाता हूं; –

संबंधित मुद्दे