确保字符串每 n 个字符有一个中断字符



JavaScript中有没有办法在字符串中插入空格字符或软连字符,以确保没有长度超过指定的最大长度的牢不可破的子字符串?我遇到了长字符串无法在我的一些 HTML 表中正确包装的问题,并且想要一个将字符串和最大字符数以及要插入的中断字符作为输入的函数。除非必要,否则该函数不应插入中断字符。

(我知道您可以使用 CSS 强制包装,但这并不总是有效,因此需要将其作为备份)。

输入字符串不一定仅由数字和拉丁字符组成,它可以是西里尔文、中文、阿拉伯语......这可能吗?

我假设您可以使用正则表达式来查看是否有超过 n 个字符的字符串不以空格或连字符结尾......

像这样:

myBreakFunc(s, maxChars, insertBreakChar) {...}

例如:

myBreakFunc("Onetwothreefour", 3, '&shy') = "One-two-thr-eef-our"
myBreakFunc("One two three four", 3, ' ') = "One two thr ee fou r"
mybreakFunc("The quick brown fox", 5, ' ') = "The quick brown fox" // nothing to do as there are no strings longer than 5 chars without a space or hyphen
myBreakFunc("The quick-brownfox", 5, ' ') = "The quick-brown fox"

很简单,你可以恢复到:

  • x 成为breakChar角色。
  • [^x] 成为breakChar字符。
  • n 成为maxChars数字。

找到[^x]长度为n的子序列,其中前面有另一个[^x],然后在它后面插入x

下面是替换方法中的通用正则表达式:

str = str.replace(/[^x]{n}(?=[^x])/g, '$&x');

您可以使用构造函数轻松编写函数RegExp以生成上述用于自定义xn的模式。


下面是一个示例:

function myBreakFunc(str, n, x) {
var pattern = RegExp(`[^${x}]{${n}}(?=[^${x}])`, 'g');
return str.replace(pattern, '$&' + x)
}
var res = myBreakFunc("One two three four", 3, ' ');
console.log(res);

这是我的javascript函数:

function forceBreaks(s, ch, maxLen) {
var ret = "";
var index = 0;
var shyChar = String.fromCharCode(0xAD);
while (index < s.length) {
// get the first substring of size maxLen+1
s1 = s.substr(index,maxLen+1);
// if there are no breaking characters insert ch character (eg a soft-hyphen) at the end of the string
var i1 = s1.indexOf(' ');
var i2 = s1.indexOf('-');
var i3 = s1.indexOf(shyChar);
if (i1 == -1 && i2 == -1 && i3 == -1) {
s1 = s.substr(index, maxLen);
ret += s1 + ch;
index += maxLen;
}
else {
var lastBreakCharIndex = Math.max(i1, i2, i3);
ret += s1.substr(0,lastBreakCharIndex+1);
index += lastBreakCharIndex+1;
}
}
// remove the trailing ch character if we added one to the end
if (ret.charAt( ret.length-1 ) == ch) {
ret = ret.slice(0, -1)
}
return ret;
};

它确实可以解决问题,但我相信有一种更优雅的方法。

相关内容

最新更新