जावास्क्रिप्ट स्ट्रिंग newline चरित्र?


424

है \nसभी प्लेटफार्मों के लिए जावास्क्रिप्ट में सार्वभौमिक न्यू लाइन चरित्र अनुक्रम? यदि नहीं, तो मैं वर्तमान परिवेश के लिए चरित्र का निर्धारण कैसे करूँ?

मैं HTML newline एलिमेंट ( <BR/>) के बारे में नहीं पूछ रहा हूँ । मैं जावास्क्रिप्ट स्ट्रिंग्स के भीतर उपयोग किए जाने वाले न्यूलाइन वर्ण अनुक्रम के बारे में पूछ रहा हूं।


5
मेरे पास एक बहु-इनपुट इनपुट नियंत्रण है जहां उपयोगकर्ता को एक नई पंक्तिबद्ध सूची में प्रवेश करने की उम्मीद है। मुझे पहली बार न्यूलाइन्स पर स्ट्रिंग को विभाजित करके सूची को पार्स करने की आवश्यकता है।
लैंडन कुह्न

7
@ landon9720: मेरे बहुस्तरीय इनपुट नियंत्रणों के लिए, मेरे पास एक getValueफ़ंक्शन है जो valueरिटर्न लेता है value.replace(/\r\n/g,'\n')- बस आउटपुट को ब्राउज़रों / प्लेटफार्मों में सुसंगत रखने के लिए।
रॉय टिंकर

1
विशेष रूप से प्रोग्रामिंग के लिए नए लोगों के लिए अच्छा सवाल है! HTML के बाहर और जावास्क्रिप्ट में यह जानना अच्छा है कि अगली / नई लाइन को कैसे तोड़ना है।
एरिक बिशार्ड

चेकआउट npmjs.com/package/eol
ryanve

जवाबों:


362

मैंने अभी जावास्क्रिप्ट के इस मूर्खतापूर्ण बिट का उपयोग करके कुछ ब्राउज़रों का परीक्षण किया है:

function log_newline(msg, test_value) {
  if (!test_value) { 
    test_value = document.getElementById('test').value;
  }
  console.log(msg + ': ' + (test_value.match(/\r/) ? 'CR' : '')
              + ' ' + (test_value.match(/\n/) ? 'LF' : ''));
}

log_newline('HTML source');
log_newline('JS string', "foo\nbar");
log_newline('JS template literal', `bar
baz`);
<textarea id="test" name="test">

</textarea>

विंडोज के उपयोग पर IE8 और ओपेरा 9 \r\n। अन्य सभी ब्राउज़रों का मैंने परीक्षण किया (विंडोज पर सफारी 4 और फ़ायरफ़ॉक्स 3.5, और लिनक्स पर फ़ायरफ़ॉक्स 3.0) का उपयोग करें \n\nमान सेट करते समय वे सभी ठीक से संभाल सकते हैं , हालांकि IE और ओपेरा उसको \r\nफिर से आंतरिक रूप से बदल देंगे । जावास्क्रिप्ट में लाइन एंडिंग नामक कुछ और विवरणों के साथ साइटप्ले लेख है

यह भी ध्यान दें कि यह HTML फ़ाइल अपने आप में वास्तविक लाइन अंत से स्वतंत्र है (दोनों \nऔर \r\nएक ही परिणाम दे)।

फ़ॉर्म सबमिट करते समय, सभी ब्राउज़र %0D%0AURL एन्कोडिंग में नईलाइन्स को कैनोनिकलाइज़ करते हैं। यह देखने के लिए, उदाहरण के लिए लोड करें data:text/html,<form><textarea name="foo">foo%0abar</textarea><input type="submit"></form>और सबमिट बटन दबाएं। (कुछ ब्राउज़र सबमिट किए गए पृष्ठ का लोड रोकते हैं, लेकिन आप कंसोल में URL-एन्कोडेड फ़ॉर्म मान देख सकते हैं।)

मुझे नहीं लगता कि आपको वास्तव में किसी भी निर्धारण के लिए बहुत कुछ करने की आवश्यकता है। यदि आप टेक्स्ट को न्यूलाइन्स पर विभाजित करना चाहते हैं, तो आप कुछ ऐसा कर सकते हैं:

lines = foo.value.split(/\r\n|\r|\n/g);

14
मेरे लिए काम किया, हालांकि वैश्विक ध्वज का उपयोग करना था: / \ r \ n | \ r | \ n / g
AdrianoFerrari

17
@ यह गलत और गलत है, क्योंकि यह \r\nएक के बजाय दो नई कहानियों के रूप में माना जाएगा । यदि आप कम चाहते हैं, /\r?\n/gतो शायद करेंगे (जो अभी भी मैक ओएस 9 का उपयोग करता है?)।
व्यापारी

1
यह देखते हुए कि साइटप्वाइंट लेख 2004 से है, वहां की जानकारी वर्तमान जेएस कार्यान्वयन के लिए प्रासंगिक नहीं हो सकती है।
cbmanica

मैच माना जाता है कि विभाजन की तुलना में बहुत तेज़ है: jsperf.com/regex-split-vs-match
Wilt

यह ओवरकिल जैसा लगता है, एक सरल समाधान के लिए नीचे मेरा जवाब देखें!
कासिम

81

हाँ, यह सार्वभौमिक है।

हालाँकि '\n', यह सार्वभौमिक न्यूलाइन वर्ण है, लेकिन आपको यह ध्यान रखना होगा कि, आपके इनपुट के आधार पर, नई लाइन वर्णों को कैरिज रिटर्न वर्ण ( '\r') से पहले लिया जा सकता है ।


55
\ n यूनिवर्सल लाइन फीड कैरेक्टर (LF) है। सटीक न्यूलाइन बाइट अनुक्रम प्लेटफ़ॉर्म (\ r \ n, \ n, या \ r: en.wikipedia.org/wiki/Newline ) पर निर्भर करता है । और यह सवाल लैंडन पूछ रहा है। जब आप पहली बार कहते हैं कि यह सार्वभौमिक न्यूलाइन वर्ण है, तो आप खुद का विरोध कर रहे हैं और फिर कहें कि यह सीआर से पहले हो सकता है। इनमें से कौनसा?
व्यापारी

2
\ n न्यूलाइन (लाइन फीड) चरित्र है, भले ही यह एक गाड़ी वापसी से पहले हो। सीआर को कभी भी अपने आप में उपयोग नहीं किया जाना चाहिए, हालांकि अधिकांश विंडोज एप और एप्लिकेशन इसे एक नई पंक्ति के रूप में पार्स करेंगे। LF विंडोज में भी काम करता है। सीआर केवल उस समय से एक कलाकृति है जब कंप्यूटर केवल इलेक्ट्रॉनिक टाइपराइटर थे।
गोलेज़ट्रॉल

3
@GolezTrol अपने दम पर सीआर का उपयोग करने के लिए वैध कारण हैं। उदाहरण के लिए, अगली पंक्ति में जाने के बिना, लाइन को अधिलेखित करने के लिए कंसोल विंडो में लाइन की शुरुआत में वापस आना। इसका उपयोग अक्सर कमांड लाइन उपयोगिताओं में बदलते प्रतिशत प्रगति संकेतक लिखने के लिए किया जाता है।
डैन बेचर

2
@ प्रतिक्रिया के लिए धन्यवाद। बेशक, मुझे कभी भी "कभी नहीं" कहना चाहिए, क्योंकि सीआर के लिए वास्तव में अपने आप ही आवेदन हैं। लेकिन सवाल जावास्क्रिप्ट के बारे में है कमांड लाइन उपयोगिताओं के बारे में नहीं। बेशक सीएलआई मोड में एक स्क्रिप्ट चल रही हो सकती है (हालांकि मुझे नहीं पता कि सीआर आप की तरह काम करेगा या नहीं), और आप कमांड लाइन में चलने वाली स्क्रिप्ट उत्पन्न करने के लिए जावास्क्रिप्ट का उपयोग भी कर सकते हैं। वे नियम के लिए संभावित अपवाद हैं, लेकिन प्रश्न के संदर्भ में वे लागू नहीं होते हैं। फिर भी, इसका उल्लेख करने के लिए धन्यवाद।
गोलेज़ट्रोल

65

"\ N" का उपयोग न करें। बस यह प्रयास करें:

var string = "this\
is a multi\
line\
string";

बस एक बैक-स्लैश दर्ज करें और ट्रकिन पर रखें '! एक जादू की तरह काम करता है।


ईएस 6 tildeचरित्र के साथ बहुस्तरीय मूल्यों का भी समर्थन करता है (अन्यथा बैकटिक कहा जाता है)।
कासिम

10
@Qasim - FYI करें, मेरा मानना है कि टिल्ड और बैकटिक अलग चरित्र, देख ~टिल्ड बनाम `backtick
क्रिस बर्गेस

1
आह - हाँ, तुम सही हो। ES6 मल्टीलाइन स्ट्रिंग्स के लिए बैकटिक चरित्र का उपयोग करता है
कासिम

2
हालांकि कानूनी, कि जेएस हलकों में पर आधारित है। इसमें पठनीयता का अभाव है। यदि आप कर सकते हैं, तो ES6 के बैकटिक्स का उपयोग करें। यदि नहीं, तो \ n
गोटोफ़्रीज़

3
जब कोड लिखना यह काम करता है। ऐसा लगता है कि ओपी एक textarea से पाठ पार्सिंग के बारे में है, हालांकि।
जिंगलेथुला

53

नई लाइन के चरित्र के सभी मामलों को संभालना आसान है बजाय इसके कि वह किस मामले को लागू करे। उदाहरण के लिए, यदि आपको नई पंक्ति को बदलने की आवश्यकता है तो निम्न कार्य करें:

htmlstring = stringContainingNewLines.replace(/(\r\n|\n|\r)/gm, "<br>");

1
उत्तम। बाद के संस्करणों में महान काम करता है FF और IE (हालांकि पुराने संस्करणों का परीक्षण नहीं किया गया)
EvilDr


13

ईमेल लिंक फ़ंक्शन मैं "% 0D% 0A" का उपयोग करता हूं

function sendMail() {   
var bodydata="Before "+ "%0D%0A";
    bodydata+="After"

var MailMSG = "mailto:aaa@sss.com" 
         + "?cc=07@sss.com" 
         + "&subject=subject" 
         + "&body=" + bodydata; 
window.location.href = MailMSG; 
} 

[HTML]

<a href="#" onClick="sendMail()">Contact Us</a>

टैब कुंजी के लिए कोई भी इस प्रकार का कोड जानता है? मुझे "% 0D% 09" की कोशिश की जा रही है, लेकिन काम नहीं कर रहा है।
निलय

7

वर्तमान ब्राउज़र के लिए एक लाइन विभाजक प्राप्त करें:

function getLineSeparator() {
  var textarea = document.createElement("textarea");
  textarea.value = "\n"; 
  return textarea.value;
}

3
कैसे के बारे में return textarea.value;?
XP1

JSON.stringifyपरिणाम पर उपयोग करने से चरित्र बदल जाएगा? अगर मैं एक alert()कॉल में परिणाम देखने की कोशिश करता हूं तो यह मुझे चरित्र नहीं दिखाता है जब तक कि मैं इसे पहले से

4

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

उदाहरण के लिए ('नोट' नाम की एक परत का चयन करने के लिए और सभी अवधियों के बाद लाइन फ़ीड जोड़ें):

var layerText = app.activeDocument.artLayers.getByName('Note').textItem.contents;
layerText = layerText.replace(/\. /g,".\r");

क्यों यह पता लगाने की कोशिश कर रहा था \nऔर <br/>मेरी फ़ोटोशॉप स्क्रिप्ट में काम नहीं कर रहे थे ... धन्यवाद!
जेक स्टॉफ़लर

3

आप ES6 के साथ `` उद्धरण (जो Esc बटन के नीचे हैं) का उपयोग कर सकते हैं। तो आप कुछ इस तरह लिख सकते हैं:

var text = `fjskdfjslfjsl
skfjslfkjsldfjslfjs
jfsfkjslfsljs`;

1

मेरा मानना ​​है कि यह है - जब आप जेएस स्ट्रिंग्स के साथ काम कर रहे हैं।

यदि आप HTML उत्पन्न कर रहे हैं, हालांकि, आपको <br />टैग का उपयोग करना होगा (नहीं \n, जैसा कि आप JS के साथ काम नहीं कर रहे हैं)


1

मुझे \ n या \ r \ n के साथ नई रेखा व्यक्त करने की समस्या थी ।
जादुई रूप से चरित्र \ r जो गाड़ी वापसी के लिए उपयोग किया जाता है, मेरे लिए एक नई लाइन की तरह काम करता है।
तो कुछ मामलों में, \ r पर भी विचार करना उपयोगी है।


ऐसा तब होता है जब आपके स्ट्रिंग में ISO-8859-1 charset
CodeBrauer

0
printAccountSummary: function()
        {return "Welcome!" + "\n" + "Your balance is currently $1000 and your interest rate is 1%."}
};
console.log(savingsAccount.printAccountSummary()); // method

प्रिंटों:

Welcome!
Your balance is currently $1000 and your interest rate is 1%.

0

एक व्यावहारिक अवलोकन ... मेरी नोड्स स्क्रिप्ट में मेरे पास निम्न कार्य हैं:

function writeToLogFile (message) {
    fs.appendFile('myserverlog.txt', Date() + " " + message + "\r\n", function (err) {
        if (err) throw err;
    });
}

पहले मेरे पास केवल "\ n" था, लेकिन मैंने देखा कि जब मैं नोटपैड में लॉग फ़ाइल खोलता हूं, तो यह एक ही लाइन पर सभी प्रविष्टियों को दिखाता है। दूसरी ओर नोटपैड ++ अपनी लाइन पर प्रत्येक को प्रविष्टियाँ दिखाता है। कोड को "\ r \ n" में बदलने के बाद, यहां तक ​​कि नोटपैड अपनी प्रविष्टि को हर पंक्ति में दिखाता है।


-3

\nसभी मामलों मैं का सामना किया है के लिए ठीक है। मैं आप वेब के साथ काम कर रहा हूं, इसका उपयोग करें \nऔर इसके बारे में चिंता न करें (जब तक कि आपके पास कोई नई-नई संबंधित समस्याएं नहीं हैं)।


-13

आप उपयोग कर सकते हैं <br/>और document.write/, document.writelnएक।


4
कृपया प्रश्न को पुनः पढ़ें। यह विशेष रूप से कहता है कि वह <br>
Leigh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.