2011-02-12 11 views
20

मेरे पास एक php पार्सर है जो लाइन-ब्रेक द्वारा दिए गए स्ट्रिंग को विभाजित करता है, ऐसा कुछ कर रहा है:मैं n और इसके विपरीत के बजाय PHP_EOL का उपयोग कब करूं? अजाक्स/Jquery ग्राहक समस्या

$lines = explode(PHP_EOL,$content); 

सर्वर पक्ष पर काम करते समय पार्सर ठीक काम करता है। हालांकि, जब मैं AJAX द्वारा पोस्ट के माध्यम से सामग्री पास करता हूं (jquery's $ .post विधि का उपयोग कर) समस्या उत्पन्न होती है: लाइन ब्रेक पहचान नहीं पाए जाते हैं। तो लगभग एक घंटे के परीक्षण और हेड-एश के बाद मैंने PHP_EOL को "\ n" में बदलने का फैसला किया और यह काम किया:

$ lines = विस्फोट ("\ n", $ सामग्री);

अब यह काम करता है! अरे, मैं इतना समय खो गया! PHP_EOL और "\ n" का उपयोग करते समय कोई मुझे बता सकता है, तो मैं भविष्य में समय बचा सकता हूं? अपने तरह के उत्तरों की सराहना करते हैं;)

+3

'PHP_EOL' अंतर्निहित फाइल सिस्टम के आधार पर परिवर्तन करता है। – drudge

+4

संभावित डुप्लिकेट [मैं PHP निरंतर "PHP_EOL" का उपयोग कब करूं?] (Http://stackoverflow.com/questions/128560/when-do-i-use-the-php-constant-php-eol) – mario

उत्तर

37

स्थिर PHP_EOL आमतौर पर प्लेटफ़ॉर्म-विशिष्ट आउटपुट के लिए उपयोग किया जाना चाहिए।

  • अधिकतर फ़ाइल आउटपुट वास्तव में।
  • वास्तव में फ़ाइल फ़ंक्शन पहले से ही \n ← → \r\n विंडोज सिस्टम पर तब तक बदलते हैं जब तक कि fopen(…, "wb") बाइनरी मोड में उपयोग नहीं किया जाता है।
फ़ाइल इनपुट आप \n तथापि पसंद करते हैं चाहिए

। जबकि अधिकांश नेटवर्क प्रोटोकॉल (HTTP) को \r\n का उपयोग करना चाहिए, इसकी गारंटी नहीं है।

$lines = array_map("rtrim", explode("\n", $content)); 

या file(…, FILE_IGNORE_NEW_LINES) समारोह अभी उपयोग, EOL PHP या auto_detect_line_endings को निपटने छोड़ने के लिए:

  • इसलिए यह \n पर टूटने और मैन्युअल रूप से किसी भी वैकल्पिक \r दूर करने के लिए सबसे अच्छा है।

  • एक और अधिक मजबूत और terser विकल्प preg_split() और एक regexp उपयोग कर रहा है:

    $lines = preg_split("/\R/", $content); 
    

    \R placeholder \ r + \ Nके किसी भी संयोजन का पता लगाता है। तो सबसे सुरक्षित होगा, और यहां तक ​​कि क्लासिक मैकोज़ ≤ 9 टेक्स्ट फ़ाइलों के लिए भी काम करेगा (अभ्यास में शायद ही कभी देखा जाता है)।

    अनिवार्य microoptimization ध्यान दें:
    जबकि रेगुलर एक्सप्रेशन से एक लागत है, यह आश्चर्य की बात अक्सर मैनुअल छोरों और PHP में स्ट्रिंग postprocessing से त्वरित है।

और वहाँ कुछ उत्कृष्ट उदाहरण है जहाँ आप से बचना चाहिएPHP_EOL अपने platform-ambiguity की वजह से कर रहे हैं: जैसे HTTP fsockopen() से अधिक के रूप

  • नेटवर्क प्रोटोकॉल पेलोड के मैनुअल पीढ़ी,।
  • mail() और एमआईएम निर्माण (जो वास्तव में, आपको वैसे भी खुद को कड़ी मेहनत नहीं करनी चाहिए)।
  • फ़ाइल उत्पादन, अगर आप लगातार लिखने के लिए सिर्फ यूनिक्स \n नई-पंक्तियों पर्यावरण की परवाह किए बिना चाहते हैं।

तो जब फ़ाइलों के लिए लिख नहीं है, लेकिन एक विशिष्ट संदर्भ कि नेटवर्क लाइनब्रेक उम्मीद के लिए डेटा को तैयार एक शाब्दिक "\r\n" संयोजन का उपयोग करें।

+3

सावधान रहें पुराने मैक '\ r' का उपयोग करते हैं, यह एक बेहतर समाधान होगा:' preg_replace ('~ \ r \ n? ~', "\ n", $ str); '। –

4

PHP_EOL सर्वर प्लेटफार्म द्वारा उपयोग किए जाने वाले लाइन ब्रेक कैरेक्टर को लगातार पकड़ रहा है। विंडोज के मामले में, यह \r\n है। * Nix पर, यह \n है। आपके पास स्पष्ट रूप से एक विंडोज सर्वर है।

यदि आप * निक्स सर्वर पर थे, तो उस परिवर्तन ने इसे ठीक नहीं किया होगा, क्योंकि यह \n होगा। यदि आप क्लाइंट (यानी ब्राउजर) को डेटा भेज रहे हैं, तो आपको लाइन ब्रेक पहचाने जाने के लिए \r\n का उपयोग करना चाहिए।

7

PHP_EOL लॉग फ़ाइलों जैसे आउटपुट लिखते समय उपयोग किया जाना चाहिए।

यह आपके प्लेटफ़ॉर्म के लिए विशिष्ट लाइन ब्रेक का उत्पादन करेगा।

2

PHP_EOL सर्वर PHP द्वारा उपयोग की जाने वाली रेखा समाप्त हो रही है। उपयोगकर्ता द्वारा सबमिट की गई सामग्री में शायद वे जो भी प्रारूप उपयोग करते हैं, उसमें अंततः लाइन समाप्त हो जाएगी। हालांकि, न्यूलाइन पर विस्फोट करने के बजाय, बस file() फ़ंक्शन का उपयोग करके, यह वही करता है जो आप बाद में करते हैं।

0

PHP_EOL का उपयोग कर IMHO बेहतर है

लाइन ब्रेक के PHP और जे एस हैंडलिंग के बीच निरंतरता सुनिश्चित करने के लिए, आप बाद में PHP_EOL

var eol = '<?php echo str_replace(array("\n","\r"),array('\\n','\\r'),PHP_EOL) ?>'; 

का उपयोग कर जे एस में अंत के रेखाएं चर को परिभाषित करने, उपयोग कर सकते हैं सबमिट किए गए टेक्स्टरेरा सामग्री को विभाजित करने के लिए eol

+0

यह दिखाने के लिए कोड का अच्छा स्निपेट है कि आप जेएस में सर्वर-साइड मानों को "निर्यात" कैसे कर सकते हैं। लेकिन लाइन-ब्रेक का पूरा मुद्दा बहुत जटिल है, क्योंकि यह थ्रेड दिखाता है [लिंक] (http://stackoverflow.com/questions/6833269/javascript-platform-independent-line-separator) –

+0

सर्वर पक्ष मूल्य क्यों होगा 'PHP_EOL' का ग्राहक पक्ष पर महत्वपूर्ण होना चाहिए? – alex

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

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