2

我正在尝试查找大段落(超过一定数量的字符)并将其包装到一个跨度中。目前我正在这样做:

output.replace(/(\n{2}|^)([^\n{2}]{500,})(\n{2}|$)/mg, '$1<span class="warning-big-paragraph">$2</span>$3');

降价段落通过两个换行符分隔。

问题是当我用这样的样本数据测试它时:

text text text text [500 other chars]

text text text text [300 other chars]
text text text text [300 other chars]

它不包含第二段。

4

2 回答 2

2

这部分[^\n{2}]{500,},没有做你认为它做的事情。它将匹配 500 个或更多的任何字符,除了换行符、、、{2时间}。尝试这个:

var pattern = /(\n{2}|^)((?:[^\n]|[^\n]\n[^\n]){500,})(\n{2}|$)/mg

这将匹配一对换行符或字符串的开头,后跟 500 个或更多非换行符或不与任何其他换行符相邻的换行符,然后是一对换行符或字符串的结尾。

但是这里仍然存在一些问题:

  1. 如果它之前有一个新行,它将不匹配第一段,如果它后面有一个新行,则它不会匹配最后一段。
  2. 两个连续的长段落之间需要四个换行符,因为前一个匹配以两个新行结束,下一个匹配以两个新行开始。

这个模式解决了这两个问题:

var pattern = /(\n{2}|^\n|^)((?:[^\n]|[^\n]\n[^\n]){500,})(?=\n{2}|\n$|$)/mg

这将匹配一对换行符、字符串的开头和一个换行符,或字符串的开头,后跟 500 个或更多非换行符或不与任何其他换行符相邻的换行符换行符,后跟一对换行符,一个换行符和字符串的结尾,或字符串的结尾。最后一部分是前瞻断言,所以它不包含在匹配中,这意味着对于两个连续的匹配,它可以用作上一个匹配的条件和下一个匹配的一部分。

你可以在这里测试它。

于 2013-08-07T12:57:07.837 回答
1

总是有蛮力的方法:

output = output.split("\n\n").map(function(para) {
    return (para.length > 500
        ? ('<div class="warning-big-paragraph">' + para + '</div>')
        : para);
}).join("\n\n");

实例| 直播源

注意:Array#map从 ES5 开始使用,对于某些浏览器(尤其是 IE8 和更早版本)需要“垫片”。如果您搜索“ES5 shim”,您会发现几个选项。

或者无聊的老式方式:

var paras;
var index;
var para;
paras = output.split("\n\n");
for (index = 0; index < paras.length; ++index) {
    para = paras[index];
    if (para.length > 500) {
        paras[index] = '<div class="warning-big-paragraph">' + para + '</div>';
    }
}
output = paras.join("\n\n");

实例| 直播源

于 2013-08-07T13:12:03.303 回答