Javascript làm thế nào để tách dòng mới


102

Tôi đang sử dụng jquery và tôi có một vùng văn bản. Khi tôi gửi bằng nút của mình, tôi sẽ cảnh báo từng văn bản được phân tách bằng dòng mới. Làm thế nào để tách văn bản của tôi khi có dòng mới?

  var ks = $('#keywords').val().split("\n");
  (function($){
     $(document).ready(function(){
        $('#data').submit(function(e){
           e.preventDefault();
           alert(ks[0]);
           $.each(ks, function(k){
              alert(k);
           });
        });
     });
  })(jQuery);

đầu vào ví dụ:

Hello
There

Kết quả tôi muốn là:

alert(Hello); and
alert(There)

Câu trả lời:


88

Hãy thử khởi tạo ksbiến bên trong hàm gửi của bạn.

  (function($){
     $(document).ready(function(){
        $('#data').submit(function(e){
           var ks = $('#keywords').val().split("\n");
           e.preventDefault();
           alert(ks[0]);
           $.each(ks, function(k){
              alert(k);
           });
        });
     });
  })(jQuery);

2
alert (k) chỉ cảnh báo số thứ tự, không cảnh báo giá trị. Bạn nên cảnh báo (ks [k])
HBlackorby

2
@hblackorby Cảm nhận của bạn, mặc dù có liên quan, có phần của một điểm câm như vấn đề chính OP ở đây là phạm vi và khởi tạo của biến mình "ks"
John Hartsock

89

Bạn nên phân tích cú pháp dòng mới bất kể nền tảng (hệ điều hành) Sự phân tách này là phổ biến với các biểu thức chính quy. Bạn có thể cân nhắc sử dụng cái này:

var ks = $('#keywords').val().split(/\r?\n/);

Ví dụ

"a\nb\r\nc\r\nlala".split(/\r?\n/) // ["a", "b", "c", "lala"]

49

Nó nên được

yadayada.val.split(/\n/)

bạn đang chuyển một chuỗi ký tự tới lệnh tách, không phải là regex.


4
"\n"/\n/là hai thứ HOÀN TOÀN khác nhau trong JS. "= string, /= regex.
Marc B

25
Có, nhưng sự khác biệt hiệu quả là gì? Không "\n"/\n/phù hợp với những thứ giống nhau?
Scott Stafford

22
Cả "\ n" và / \ n / sẽ hoạt động giống nhau, nhưng tùy thuộc vào nguồn bạn đang tách, một cái gì đó như val.split (/ [\ r \ n] + /) có thể tốt hơn. Nếu nguồn của bạn có dấu ngắt dòng "\ r \ n" thì việc tách trên "\ n" sẽ để lại dấu "\ r" ở cuối có thể gây ra sự cố.
xtempore

30

Vì bạn đang sử dụng textarea, bạn có thể tìm thấy \ n hoặc \ r (hoặc \ r \ n) cho các ngắt dòng. Vì vậy, những điều sau được đề xuất:

$('#keywords').val().split(/\r|\n/)

ref: kiểm tra xem chuỗi có ngắt dòng không


29
hoặc, cụ thể hơn, /\r?\n/... Tôi nghĩ rằng việc sử dụng |(hoặc) sẽ xen kẽ các kết quả trống cho phần cuối dòng CRLF.
Dusty

Bạn sẽ không thấy ngắt dòng chỉ CR ( \r) ở bất kỳ đâu trên web hiện đại. Nơi cuối cùng mà chúng được sử dụng rộng rãi là trong các phiên bản Mac OS cổ từ gần 20 năm trước.
Ilmari Karonen

8

Chỉ

var ks = $('#keywords').val().split(/\r\n|\n|\r/);

sẽ hoạt động hoàn hảo.

Đảm bảo \r\nđược đặt ở đầu chuỗi RegExp , vì nó sẽ được thử trước.


Sự gkết thúc của regex là không cần thiết
Yetti99

4

Cách đơn giản và an toàn nhất để tách một chuỗi bằng cách sử dụng các dòng mới, bất kể định dạng (CRLF, LFCR hoặc LF), là loại bỏ tất cả các ký tự xuống dòngsau đó tách trên các ký tự dòng mới ."text".replace(/\r/g, "").split(/\n/);

Đảm bảo này là khi bạn có những dòng mới liên tục (ví dụ \r\n\r\n, \n\r\n\rhoặc \n\n) kết quả sẽ luôn luôn giống nhau.

Trong trường hợp của bạn, mã sẽ giống như sau:

(function ($) {
    $(document).ready(function () {
        $('#data').submit(function (e) {
            var ks = $('#keywords').val().replace(/\r/g, "").split(/\n/);
            e.preventDefault();
            alert(ks[0]);
            $.each(ks, function (k) {
                alert(k);
            });
        });
    });
})(jQuery);

Dưới đây là một số ví dụ cho thấy tầm quan trọng của phương pháp này:

var examples = ["Foo\r\nBar", "Foo\r\n\r\nBar", "Foo\n\r\n\rBar", "Foo\nBar\nFooBar"];

examples.forEach(function(example) {
  output(`Example "${example}":`);
  output(`Split using "\n": "${example.split("\n")}"`);
  output(`Split using /\r?\n/: "${example.split(/\r?\n/)}"`);
  output(`Split using /\r\n|\n|\r/: "${example.split(/\r\n|\n|\r/)}"`);
  output(`Current method: ${example.replace(/\r/g, "").split("\n")}`);
  output("________");
});

function output(txt) {
  console.log(txt.replace(/\n/g, "\\n").replace(/\r/g, "\\r"));
}


3
  1. Di chuyển var ks = $('#keywords').val().split("\n");bên trong trình xử lý sự kiện
  2. Sử dụng alert(ks[k])thay vìalert(k)

  (function($){
     $(document).ready(function(){
        $('#data').submit(function(e){
           e.preventDefault();
           var ks = $('#keywords').val().split("\n");
           alert(ks[0]);
           $.each(ks, function(k){
              alert(ks[k]);
           });
        });
     });
  })(jQuery);

Bản giới thiệu


1

Good'ol javascript:

 var m = "Hello World";  
 var k = m.split(' ');  // I have used space, you can use any thing.
 for(i=0;i<k.length;i++)  
    alert(k[i]);  

0

Vấn đề là khi bạn khởi tạo ks, nó valuevẫn chưa được thiết lập.

Bạn cần lấy giá trị khi người dùng gửi biểu mẫu. Vì vậy, bạn cần khởi tạo ksbên trong hàm gọi lại

(function($){
   $(document).ready(function(){
      $('#data').submit(function(e){
      //Here it will fetch the value of #keywords
         var ks = $('#keywords').val().split("\n");
         ...
      });
   });
})(jQuery);

0

Đây là ví dụ với console.logthay vì alert(). Nó tiện ích hơn :)

var parse = function(){
  var str = $('textarea').val();
  var results = str.split("\n");
  $.each(results, function(index, element){
    console.log(element);
  });
};

$(function(){
  $('button').on('click', parse);
});

Bạn có thể thử nó tại đây


-1

(function($) {
  $(document).ready(function() {
    $('#data').click(function(e) {
      e.preventDefault();
      $.each($("#keywords").val().split("\n"), function(e, element) {
        alert(element);
      });
    });
  });
})(jQuery);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<textarea id="keywords">Hello
World</textarea>
<input id="data" type="button" value="submit">


1
Cách tiếp cận này cũng được bao phủ bởi những câu trả lời hiện
KyleMit

@KyleMit yeah, tôi đi qua những câu trả lời, hầu hết các câu trả lời có thể xảy ra tương tự do khái niệm cơ bản của javascript, nhưng tôi tập trung hoặc mối quan tâm với các dòng mã đó là lý do tại sao tôi đăng câu trả lời ...
ankitkanojia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.