JavaScript dize satırsonu karakteri?


424

\ntüm platformlar için JavaScript evrensel satır karakteri dizisi? Değilse, mevcut ortamın karakterini nasıl belirlerim?

HTML newline öğesi ( <BR/>) hakkında sormuyorum . JavaScript dizelerinde kullanılan newline karakter dizisini soruyorum.


5
Kullanıcının yeni satır ayrılmış bir listeye girmesi beklenen çok satırlı bir giriş denetimim var. Önce newlines dizesini bölerek listeyi ayrıştırmak gerekiyor.
Landon Kuhn

7
@ landon9720: Çok satırlı giriş denetimlerim için, yalnızca tarayıcılar / platformlar arasında çıktıyı tutarlı tutmak için ve getValueişlevini alan bir işlevim var . valuevalue.replace(/\r\n/g,'\n')
Roy Tinker

1
Özellikle programlamaya yeni başlayanlar için iyi bir soru! HTML dışında ve JavaScript'te bir sonraki / yeni satıra nasıl geçeceğinizi bilmek iyidir.
Eric Bishard

Yanıtlar:


362

Az önce bu aptalca JavaScript'i kullanarak birkaç tarayıcıyı test ettim:

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 ve Opera 9, Windows üzerinde kullanılır \r\n. Test ettiğim diğer tüm tarayıcılar (Windows'ta Safari 4 ve Firefox 3.5 ve Linux'ta Firefox 3.0) kullanıyor \n. \nIE ve Opera bunu \r\ndahili olarak tekrar dönüştürecek olsa da, değer ayarlarken hepsi iyi işleyebilir . Javascript'te Satır sonları adı verilen bazı ayrıntıları içeren bir SitePoint makalesi var .

Bunun HTML dosyasının kendisindeki gerçek satır sonlarından bağımsız olduğunu da unutmayın (her ikisi de \n ve \r\naynı sonuçları verir).

Bir form gönderirken, tüm tarayıcılar yeni satırları %0D%0A URL kodlamasında . Bunu görmek için örn. Yükleyin data:text/html,<form><textarea name="foo">foo%0abar</textarea><input type="submit"></form>ve gönder düğmesine basın. (Bazı tarayıcılar gönderilen sayfanın yüklenmesini engeller, ancak URL kodlu form değerlerini konsolda görebilirsiniz.)

Yine de, herhangi bir belirleme yapman gerektiğini düşünmüyorum. Metni yeni satırlara bölmek istiyorsanız, şöyle bir şey yapabilirsiniz:

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

14
Benim için çalıştı, yine de küresel bayrak kullanmak zorunda kaldı: / \ r \ n | \ r | \ n / g
AdrianoFerrari

17
@Edson ve yanlış, çünkü bir \r\nyerine iki yeni satır gibi davranacak . Kısa istiyorsanız, /\r?\n/gmuhtemelen yapacak (yine de Mac OS 9'u kim kullanıyor?).
mercator

1
SitePoint makalesinin 2004'ten geldiği göz önüne alındığında, buradaki bilgiler geçerli JS uygulamaları ile ilgili olmayabilir.
cbmanica

Maç bölündüğünden çok daha hızlı: jsperf.com/regex-split-vs-match
Wilt

Bu aşırıya kaçmış gibi görünüyor, daha basit bir çözüm için aşağıdaki cevabımı görün!
Kasım

81

Evet, evrenseldir.

'\n'Evrensel yeni satır karakterleri olmasına rağmen , girişinize bağlı olarak yeni satır karakterlerinin öncesinde satır başı karakterleri ( '\r') olabileceğini unutmayın .


55
\ n evrensel satır besleme karakteri (LF). Tam satır baytı sırası platforma bağlıdır (\ r \ n, \ n veya \ r: en.wikipedia.org/wiki/Newline ). Ve işte landon soruyor soru. Bunun evrensel yeni satır karakteri olduğunu ilk söylediğinizde, sonra da bir CR'den önce gelebileceğini söylediğinizde kendinizle çelişiyorsunuz. Hangisi o?
mercator

2
\ n, öncesinde satır başı olsa bile, yeni satır (satır besleme) karakteridir. Çoğu Windows API'sı ve uygulaması bir satırsonu olarak ayrıştırsa da, CR hiçbir zaman kendi başına kullanılmamalıdır. LF, Windows'da da iyi çalışır. CR, bilgisayarların sadece elektronik daktilolar olduğu zamanlardan kalma bir eserdir.
GolezTrol

3
@GolezTrol CR'yi kendi başına kullanmak için geçerli nedenler vardır. Örneğin, bir sonraki satıra geçmeden satırın üzerine yazmak için konsol penceresindeki satırın başına dönme. Bu genellikle komut satırı yardımcı programlarına değişen yüzde ilerleme durumu göstergesi yazmak için kullanılır.
Dan Bechard

2
@Dan Geri bildiriminiz için teşekkür ederiz. Tabii ki, asla "asla" dememeliydim, çünkü tek başına bir CR için başvurular var. Ancak soru, Javascript hakkında komut satırı yardımcı programlarıyla ilgili değildir. Tabii ki CLI modunda çalışan bir komut dosyası olabilir (her ne kadar CR'nin o zaman söylediğiniz gibi çalışıp çalışmadığını bilmiyorum) ve hatta komut satırında çalıştırılan bir komut dosyası oluşturmak için Javascript'i kullanabilirsiniz. Bunlar kuralın olası istisnalarıdır, ancak soru bağlamında geçerli görünmemektedir. Yine de bahsettiğiniz için teşekkürler.
9:15

65

"\ N" kullanmayın. Sadece şunu deneyin:

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

Sadece ters eğik çizgi girin ve devam edin! Tıkır tıkır çalışıyor.


ES6 ayrıca tildekarakterle çok satırlı değerleri de destekler (aksi takdirde ters tırnak olarak adlandırılır).
Qasim

10
@Qasim - FYI, tilde ve backtick'in farklı karakterler olduğuna inanıyorum, bkz. ~Tilde vs `Backtick .
Chris Burgess

1
Ah - Evet, haklısın. ES6, çok satırlı dizeler için backtick karakterini kullanıyor
Qasim

2
Yasal olmasına rağmen, JS çevrelerinde kaşlarını çattı. Okunabilirlikten yoksundur. Yapabiliyorsanız, ES6'nın ters tırnaklarını kullanın. Değilse, \ n
gotofritz

3
Kod yazarken bu işe yarar. Görünüşe göre OP bir metin alanından metin ayrıştırmakla ilgili.
jinglesthula

53

Yeni çizgi karakteriyle ilgili tüm durumları, hangisini uyguladıktan sonra uygulamak yerine işlemek en kolay yol olabilir. Örneğin, yeni satırı değiştirmeniz gerekirse aşağıdakileri yapın:

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

1
Süper. FF ve IE sonraki sürümlerinde harika çalışıyor (eski sürümleri test edilmedi)
EvilDr

25

evet, kullanmak istediğiniz html kodu oluşturmuyorsanız \ n kullanın <br />


13

E-posta bağlantı işlevi "% 0D% 0A" kullanıyorum

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>

herhangi biri sekme anahtarı için bu tür bir kod biliyor mu? "% 0D% 09" denedim ama çalışmıyor.
Nilay

7

Mevcut tarayıcı için bir hat ayırıcı alın:

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

3
Nasıl return textarea.value;?
XP1

JSON.stringifySonuçta kullanmak karakteri değiştirecek mi? Bir alert()çağrıda sonucu görüntülemeye çalışırsam, ilk önce

4

Bir not - ExtendScript JavaScript'i (Photoshop CS3 + gibi uygulamalarda kullanılan Adobe Scripting dili) kullanırken, kullanılacak karakter "\ r" dir. "\ n" yazı tipi karakteri olarak yorumlanır ve bu nedenle birçok yazı tipinin yerine bir blok karakteri olur.

Örneğin ('Not' adlı bir katman seçmek ve tüm dönemlerden sonra satır feed'leri eklemek için):

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

Neden olduğunu anlamaya çalışıyordum \nve <br/>Photoshop betiğimde çalışmadılar ... Teşekkürler!
Jake Stoeffler

3

ES6 ile `` tırnak işaretlerini (Esc düğmesinin altında olan) kullanabilirsiniz. Böylece şöyle bir şey yazabilirsiniz:

var text = `fjskdfjslfjsl
skfjslfkjsldfjslfjs
jfsfkjslfsljs`;

1

Ben inanıyorum - JS dizeleri ile çalışırken.

HTML oluşturuyorsanız, <br />etiketleri kullanmanız gerekecektir ( \nartık JS ile uğraşmadığınız için değil)


1

\ N veya \ r \ n ile yeni satırı ifade etme problemim vardı .
Sihirli karakter \ r satırbaşı için kullanılan bir satır gibi benim için çalıştı.
Yani bazı durumlarda, çok düşünmek yararlıdır.



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

Baskılar:

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

0

Pratik bir gözlem ... NodeJS betiğimde şu fonksiyon var:

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

İlk önce sadece "\ n" vardı ama günlük dosyasını Not Defteri'nde açtığımda, aynı satırdaki tüm girişleri gösterdiğini fark ettim. Notepad ++ ise girişleri kendi satırlarında gösterir. Kodu "\ r \ n" olarak değiştirdikten sonra, Not Defteri bile her girişi kendi satırında gösterir.


-3

Karşılaştığım \ntüm durumlar için gayet iyi. Web ile çalışıyorsunuz, kullanıyorsunuz \nve endişelenmeyin (yeni satırla ilgili sorunlarınız yoksa).


-13

kullanabileceğiniz <br/>ve document.write/, document.writelnbiri.


4
Lütfen soruyu tekrar okuyun. Özellikle o diyor değil soran<br>
Leigh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.