空白的Javascript-only wordwrap函数?

时间:2012-07-26 18:10:16

标签: javascript

我发现的大多数wordwrap函数都绑定到css和/或浏览器dom。 我在一个javascript环境(rhino)中工作,需要找到或设计一个更好的自动换行,它在给定的行长度值之前打破空白。 我当前的解决方案只是在给定字符之前搜索最后一个空白区域,然后剪切左侧,将其存储为输出行(在数组返回中)。重复,直到不再有文字为止。

希望有人看到优雅的东西。

3 个答案:

答案 0 :(得分:4)

你可以这样写:

var wordwrapped = original.trim().replace(/(\S(.{0,78}\S)?)\s+/g, '$1\n');

在至少一个,最多八十个,最好是尽可能多的字符后,用\s+取代\n。 (注意:如果一行中有超过80个字符没有空格,那么它们之前和之后会有一个换行符,但不会在它们内部进行换行。)

答案 1 :(得分:1)

Wordwrapper 2000

此正则表达式将包装每个0- 字符,并注意空格和连字符还会剪切比字符长的单词。在regexr上查看详细信息,示例和更多信息。

str     The string to wrapped                [string]
width   The maximum length a string can be   [number]

ES2015 / ES6

const wrapped = str.replace(new RegExp(`(?:\\S(?:.{0,${width}}\\S)?(?:\\s+|-|$)|(?:\\S{${width}}))`, 'g'), s => `${s}\n`).slice(0, -1);

// OR complete function

/**
 * Wrap every 0-`width` character and respect whitespaces and hyphens also cuts words longer than `width` characters.
 * @param str The string to wrapped
 * @param width The maximum length a string can be
 */
function wordwrap(str, width) {
    return str.replace(new RegExp(`(?:\\S(?:.{0,${width}}\\S)?(?:\\s+|-|$)|(?:\\S{${width}}))`, 'g'), s => `${s}\n`).slice(0, -1);
}

ES5及以下

var wrapped = str.replace(new RegExp('(?:\\S(?:.{0,' + width + '}\\S)?(?:\\s+|-|$)|(?:\\S{' + width + '}))', 'g'), function (s) {return s + '\n'}).slice(0, -1);

// OR complete function

/**
 * Wrap every 0-`width` character and respect whitespaces and hyphens also cuts words longer than `width` characters.
 * @param str The string to wrapped
 * @param width The maximum length a string can be
 */
function wordwrap(str, width) {
    return str.replace(new RegExp('(?:\\S(?:.{0,' + width + '}\\S)?(?:\\s+|-|$)|(?:\\S{' + width + '}))', 'g'), function (s) {return s + '\n'}).slice(0, -1);
}

TypeScript

const wrapped = str.replace(new RegExp(`(?:\\S(?:.{0,${width}}\\S)?(?:\\s+|-|$)|(?:\\S{${width}}))`, 'g'), s => `${s}\n`).slice(0, -1);

// OR complete function
/**
 * Wrap every 0-`width` character and respect whitespaces and hyphens also cuts words longer than `width` characters.
 * @param str The string to wrapped
 * @param width The maximum length a string can be
 */
function wordwrap(str: string, width: number): string {
    return str.replace(new RegExp(`(?:\\S(?:.{0,${width}}\\S)?(?:\\s+|-|$)|(?:\\S{${width}}))`, 'g'), s => `${s}\n`).slice(0, -1);
}

工作示例

function wordwrap(str, width) {
    return str.replace(new RegExp('(?:\\S(?:.{0,' + width + '}\\S)?(?:\\s+|-|$)|(?:\\S{' + width + '}))', 'g'), function (s) {return s + '\n'}).slice(0, -1);
}

var str = 'This is my regular-expression. It will wrap every 0-20 character and respect whitespaces and hyphens, also cuts reallylongwordslikethis.';

var wrapped = wordwrap(str, 20);

console.log(wrapped);

答案 2 :(得分:-1)

RegEx真的是要走的路。 /.{0,79}(?:\s|$)/g将获取80个字符以下的最长行,该字符以字符或文件末尾结尾。多次调用exec将提取每一行。

var text = "";
var regex = /.{0,79}(?:\s|$)/g;
var lines = [];
var line;

while (line = regex.exec(text)) {
    lines.push(line);
}