在 Javascript 中一定数量的字符后在空格处拆分字符串

新手上路,请多包涵

我正在尝试创建一个工具,该工具接受输入文本并将其拆分为特定字符数的文本块。但是,我需要确保它不会在单词中间拆分文本。

在我的例子中,我在 155 个字符后拆分字符串。

我已经做了很多搜索来尝试找到解决方案,但我担心它可能比我对 Javascript 的知识允许我弄清楚的更复杂。我相信我只需要制定某种逻辑,让拆分器回溯到一个空间,如果它在一个单词的中间就可以拆分,但我不确定如何写出这样的东西。

这是我目前的 javascript 代码:

 function splitText() {
    "use strict";
    var str = document.getElementById("user_input").value;
    var size = 195;
    var chunks = new Array(Math.ceil(str.length / size)),
        nChunks = chunks.length;

    var newo = 0;
    for (var i = 0, o = 0; i < nChunks; ++i, o = newo) {
          newo += size;
          chunks[i] = str.substr(o, size);
    }

    var newq = 0;
    for (var x = 0, q = 0; x < nChunks; ++x, q = newq) {
        $("#display").append("<textarea readonly>" + chunks[x] + "</textarea><br/>");
    }
}

这是我的 HTML:

 <body>
    <content>
        <h1>Text Splitter</h1>
        <form>
            <label>Enter a Message</label>
            <input type="text" name="message" id="user_input">
        </form>
        <form>
            <input type="button" onclick="splitText();" id="submit" value="Submit!"> <br/>
        </form>
        <label>Your split message: </label>
        <p><span id='display'></span></p>
    </content>
</body>

如果您想看一下,这是当前工作形式的代码: https ://jsfiddle.net/add4s7rs/7/

谢谢!感谢您的帮助!

原文由 Leminnes 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 375
2 个回答

使用正则表达式将字符串拆分成一定长度的块的一种简短方法:

 const chunks = str.match(/.{1,154}(?:\s|$)/g);

一些例子:

 const str = 'the quick brown fox jumps over the lazy dog';

console.log(str.match(/.{1,10}(?:\s|$)/g))
console.log(str.match(/.{1,15}(?:\s|$)/g))

这是有效的,因为量词(在这种情况下 {1,154} )默认情况下是贪婪的,并且会尝试匹配尽可能多的字符。将 (\s|$) 放在 .{1,154} 后面强制匹配终止于空白字符或字符串的末尾。所以 .{1,154}(\s|$) 将匹配最多 154 个字符后跟一个空白字符。 /g 修饰符使它继续匹配整个字符串。

把它放在你的函数的上下文中:

 function splitText() {
    "use strict";
    var str = document.getElementById("user_input").value;
    var chunks = str.match(/.{1,154}(?:\s|$)/g);

    chunks.forEach(function (i,x) {
        $("#display").append("<textarea readonly>" + chunks[x] + "</textarea><br/>");
    });
}

请注意(正如评论中所指出的那样)如果字符串中的某个单词长于块的长度,则此代码将失败。

另请注意,此代码将在拆分字符串的末尾留下一个尾随空格;如果你想避免将最后一组更改为前瞻并坚持第一个字符不是空格:

 const str = 'the quick brown fox jumps over the lazy dog';

console.log(str.match(/\S.{1,9}(?=\s|$)/g))
console.log(str.match(/\S.{1,14}(?=\s|$)/g))

原文由 Nick 发布,翻译遵循 CC BY-SA 4.0 许可协议

你可以使用这样一个简单的函数:

 function split(string) {
  for(i=154; i>=0; i--) {
    if(string.charAt(i) == " ") {
      var newString1 = string.slice(0, i);
      var newString2 = string.slice(i);
    }
  }
}

如果您愿意,也可以随时将它们放入一个数组中,而不是分配给单独的字符串。

原文由 Cory Kleiser 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题