【问题标题】:JavaScript string with new line - but not using \n带有换行符的 JavaScript 字符串 - 但不使用 \n
【发布时间】:2012-04-14 14:40:51
【问题描述】:

我有一个包含新行的字符串。我想将它们转换为 HTML <br>s,但我很难检测到它们。

想象一下这样的 JavaScript 字符串集:

var foo = "Bob
is
cool";

它们是我需要检测的那种新线。它们没有使用 \n 特殊字符 - 它们只是普通格式。

【问题讨论】:

  • 那个 \n(除非它也可能是\r
  • 我认为他的意思是它们不是用\n 转义序列表达的,而是源代码中的字面意思。
  • @Pointy:但结果还是一样的,前提是这不是语法错误。
  • “纯格式”换行符只是 \n 特殊字符的可见结果。 \n 只是它的别名。
  • @Evert 是的,我当然同意;我也在考虑语法错误。

标签: javascript string


【解决方案1】:

它不起作用的原因是javascript字符串必须在下一个换行符之前终止(显然不是\n)。 \n 存在的原因是为了让开发人员可以轻松地将换行符(ASCII:10)放入他们的字符串中。

当你有一个看起来像这样的字符串时:

//Note lack of terminating double quote
var foo = "Bob 

此时您的代码将出现语法错误并停止运行。

如果您希望有一个跨越多行的字符串,您可以在终止该行之前插入一个反斜杠字符“\”,如下所示:

//Perfectly valid code
var foo = "Bob \
is \
cool.";

但是,该字符串将在字符串被分成不同行的位置包含\n 字符。在字符串中插入换行符的唯一方法是插入值为 10 的字符,最简单的方法是 \n 转义字符。

var foo = "Bob\nis\ncool.";

【讨论】:

【解决方案2】:

更新:我只是 came across 一个很棒的 JavaScript-ES6 语法设计,称为 Template literals。你想要做的事情可以使用`(反引号或重音字符)来完成。

var foo = `Bob
is
cool`;

在这种情况下,foo === "Bob\nis\ncool" 为真。

为什么设计师决定 ` ... ` 可以不终止,但 " ... "' ... ' 中包含换行符是非法的,我无法理解。

只要确保目标浏览器支持 ES6 指定的 Javascript 实现即可。

 


附:这种语法还支持 PHP、.NET 和其他一些脚本语言中的一个非常酷的特性;即“Tagged template literals”,您可以使用它构建一个参数化字符串,如下所示:

var a = 'Hello', b = 'World';
console.log(`The computer says ${ a.toUpperCase() }, ${b}!`);
// results in "The computer says HELLO, World!"

【讨论】:

  • 我正在尝试在 Google Apps 脚本 IDE 中使用 ``,它显示“非法字符。”。如何处理?
  • @kiki Google Apps 似乎支持 ES6 语法(允许这样做的 javascript 版本),
  • @kiki 所以我建议学习和使用 Babel 以便将 ES6“转换”为旧版本的 兼容 javascript 以用于 Google Apps 脚本。您也可以ask a new题为“如何在Google Apps脚本IDE中使用ES6”的问题,也许有人有解决方案。
  • 我可以给你 10 票赞成反引号答案吗?它真的像魔术一样工作! :)
  • 最佳答案兄弟
【解决方案3】:

检查\n\r\r\n

换行符有几种表示,见http://en.wikipedia.org/wiki/Newline#Representations

【讨论】:

  • 我正在这样做。我已经检查了所有三个:console.log(story.message.split(/\n/g)); console.log(story.message.split(/\r/g)); console.log(story.message.split(/\r\n/g)); 他们都返回相同的。没有拆分。
【解决方案4】:

我认为他们无论如何都在使用\n,甚至因为它不可见,或者他们可能使用\r。所以只需将\n\r 替换为<br/>

【讨论】:

    【解决方案5】:

    我认为您不了解 \n 的工作原理。结果字符串仍然只包含一个值为 10 的字节。这在 JavaScript 源代码中用 \n 表示。

    您发布的代码 sn-p 实际上不起作用,但如果起作用,换行符等效于 \n,除非它是 windows 样式的换行符,在这种情况下它会是\r\n。 (但即使替换仍然有效)。

    【讨论】:

    • 谢谢。在那种情况下,为什么这不起作用? console.log(story.message.split(/\n/g)); console.log(story.message.split(/\r/g)); console.log(story.message.split(/\r\n/g)); 他们都返回相同的。没有分裂
    【解决方案6】:

    这是对上面@Andrew Dunn 帖子的一个小补充

    两者结合可以生成可读的JS和匹配的输出

     var foo = "Bob\n\
        is\n\
        cool.\n\";
    

    【讨论】:

      【解决方案7】:

      您可以使用以下功能:

        function nl2br (str, is_xhtml) {
           var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '<br />' : '<br>';
           return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + breakTag + '$2');
        } 
      

      像这样:

      var mystr="line\nanother line\nanother line";
      mystr=nl2br(mystr);
      alert(mystr);
      

      这应该提醒line&lt;br&gt;another line&lt;br&gt;another line

      函数的来源来自这里: http://phpjs.org/functions/nl2br:480

      这模仿了php中的nl2br函数...

      【讨论】:

        【解决方案8】:

        我用来在 JS 中转义换行符的查询字符串: LOAD DATA LOCAL INFILE 'Data.csv' INTO TABLE DEMO FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 ROWS;

        这涉及到新的 ES6 语法 - Template Literals `` 我尝试将 '\n' 更改为 '\r\n' 并在我的情况下完美运行。

        PS:这个例子是我将CSV数据上传到mysql数据库的查询。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-01
          • 2021-09-26
          • 1970-01-01
          • 1970-01-01
          • 2021-07-19
          相关资源
          最近更新 更多