【问题标题】:Add line break after n characters, but if it's in the middle of a word cut the whole word and add in next line在 n 个字符后添加换行符,但如果它在一个单词的中间,则剪切整个单词并添加到下一行
【发布时间】:2016-03-03 04:05:07
【问题描述】:

我试图在每 69 个字符后在文本区域中添加换行符。我不想在中间插话。如果拆分出现在单词中间,则取出整个单词并放入下一行。例句如下:

      var sample_txt = "I THOUGHT IT WAS A SIMPLE CONCEPT \nAND DIDN'T FEEL CODE WAS REQUIRED. THE ANSWERS SO FAR SEEM TO HAVE UNDERSTOOD MY EXPLANATION AND SO I AM TRYING THEIR SOLUTIONS NOW. IF I DON'T HAVE ANY JOY I'LL POST SOME CODE. MY IMPLEMENTATION IS ACTUALLY MUCH MORE COMPLEX \nI THOUGHT IT WAS A SIMPLE CONCEPT AND DIDN'T FEEL CODE WAS REQUIRED. THE ANSWERS SO FAR SEEM TO HAVE UNDERSTOOD MY EXPLANATION AND SO I AM TRYING THEIR SOLUTIONS NOW. IF I DON'T HAVE ANY JOY I'LL POST SOME CODE. MY IMPLEMENTATION IS ACTUALLY MUCH MORE COMPLEX";

      $(document).on('blur', 'TEXTAREA', function () {
            var arr_lines = sample_txt.split('\n'),
                char_limit = 69,
                txt_val = [];

            for(var i = 0; i < arr_lines.length; i++){
                if(arr_lines[i].length > char_limit){
                    var patern = new RegExp('(.{' + (char_limit-1) + '})', 'gi'),
                        arr_txt = arr_lines[i].replace(patern, "$1\n");
                    $.each(arr_txt.split('\n'), function(i,vl){
                        txt_val.push(vl.trim());
                    });
                }else{
                    txt_val.push(arr_lines[i].trim());
                }
            }
            this.value = txt_val.join('\n');
        });

字符串还包含用户输入的换行符。我是基于 '\n' 拆分它们,然后计算字符并在字符超过限制时再次拆分它们。输出应该如下:

I THOUGHT IT WAS A SIMPLE CONCEPT  
AND DIDN'T FEEL CODE WAS REQUIRED. THE ANSWERS SO FAR SEEM TO HAVE 
UNDERSTOOD MY EXPLANATION AND SO I AM TRYING THEIR SOLUTIONS NOW. IF
I DON'T HAVE ANY JOY I'LL POST SOME CODE. MY IMPLEMENTATION IS 
ACTUALLY MUCH MORE COMPLEX 
I THOUGHT IT WAS A SIMPLE CONCEPT AND DIDN'T FEEL CODE WAS REQUIRED.
THE ANSWERS SO FAR SEEM TO HAVE UNDERSTOOD MY EXPLANATION AND SO I 
AM TRYING THEIR SOLUTIONS NOW. IF I DON'T HAVE ANY JOY I'LL POST 
SOME CODE. MY IMPLEMENTATION IS ACTUALLY MUCH MORE COMPLEX

我在 stackoverflow.com 上查看了一些示例,但我发现的大多数示例,它们只是将字符限制在一行中。他们没有把这个词放在下一行。

请提出建议。

【问题讨论】:

    标签: jquery regex string


    【解决方案1】:

    Perl 有替换操作符,对于这个问题,它会是

    首先去掉字符串中的换行符

    s/\n//g 
    

    然后在 69 个或更少字符后添加新行,后跟空格或字符串末尾

    s/(.{1,69})(?:$| )/$1\n/g
    

    它最多匹配 69 个字符和空格,后跟字符串结尾或空格。然后它会在捕获的 $1 文本之后的位置放置一个换行符。

    g 修饰符告诉它全局(在整个字符串上)执行此替换。但是,这会在字符串的最后放置一个换行符,我不知道这是否是您需要的。

    结果如下。

    我认为这是一个简单的概念,并不觉得需要代码。 到目前为止的答案似乎已经理解了我的解释,所以我是 现在尝试他们的解决方案。如果我没有任何快乐,我会发布一些 代码。我认为我的实现实际上要复杂得多 是一个简单的概念,感觉不需要代码。答案 到目前为止似乎已经理解了我的解释,所以我正在尝试 他们现在的解决方案。如果我没有任何乐趣,我会发布一些代码。我的 实现实际上要复杂得多

    但是,如果你想保留原来的换行符,像这样:

    我认为这是一个简单的概念

    并且感觉不需要代码。到目前为止的答案似乎已经有了 理解了我的解释,所以我现在正在尝试他们的解决方案。如果 我没有任何快乐我会发布一些代码。我的实现是 实际上要复杂得多

    我认为这是一个简单的概念,并不觉得需要代码。 到目前为止的答案似乎已经理解了我的解释,所以我是 现在尝试他们的解决方案。如果我没有任何快乐,我会发布一些 代码。我的实现实际上要复杂得多

    这方面的代码会更难。

    s/(.{1,69})(?:(?=\n)|$| )/$1\n/g
    

    更新:在看到您编辑的带有所需输出的帖子后,我明白了您想要什么。给出这些结果的正则表达式是

    s/(.{1,69})(?:\n|$| )/$1\n/g
    

    (忽略我上面给出的解决方案)。

    Update2: 对于 jquery,我不太清楚,语法需要是(在对 web 进行一些搜索之后),我想我找到了正确的解决方案。

    this.value = sample_txt.replace(/(.{1,69})(?:\n|$| )/g, "$1\n");
    

    【讨论】:

    • 我想保留原来的换行符,然后我想将字符限制为 69。之后它应该添加另一个换行符。
    • @sarojanand 我已经更新了我的帖子。那里的正则表达式可以满足您的需求。 (请注意,点匹配除换行符以外的所有字符)。
    • 克里斯,能否请您添加完整的语法行?我删除了所有内容并将其添加为“this.value = txt_val.replace('s/(.{1,69})(?:\n|$| )/$1\n/g');”但我认为它不起作用。
    • @sarojanand 我对 Update2 做了一点改动。将txt_val 替换为sample_txt
    • 这只是一个问题。我输入了 69,但我看到文本最多有 70 个字符。如果我将数字更改为最大 68 个字符,那么它最多可以包含 69 个字符。有什么理由比指定的最大限制多出一个字符吗?
    【解决方案2】:

    由于它是一个文本区域,您可以使用cols 属性来指定每行所需的字符数。这也处理了用户输入换行符的情况。

    这个值在 HTML5 中默认为 20(参考:https://developer.mozilla.org/en/docs/Web/HTML/Element/textarea#attr-cols

    示例代码:

    <textarea cols="69"> <!--Maximum of 69 characters when there are spaces in the text-->
    </textarea>
    

    如果您想以编程方式进行,请参考以下关于自动换行问题的文章http://www.geeksforgeeks.org/dynamic-programming-set-18-word-wrap/

    【讨论】:

    • 我需要一个 jQuery 解决方案。 cols 已定义为 69,但它不起作用,因为宽度为 100%。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多