我希望在长度为30(包括空格)时拆分文本。到目前为止我的工作:
var m = "Lorem ipsum dolor sit amet, co Lorem ipsum dolor sit amet, co Lorem ipsum dolor sit amet, co Lorem ipsum dolor sit amet, co";
var spacedM = m.split(' ');
var charCount = 0;
for(var i = 0; i < spacedM.length; i++){
charCount = charCount + spacedM[i].length + 0.5;
if(charCount <= 30 && $('#address1').text().length <= 30){
$('#address1').append(spacedM[i]+' ');
} else if(charCount > 30 && charCount <= 60 && $('#address2').text().length <= 30) {
$('#address2').append(spacedM[i]+' ');
} else if(charCount > 60 && charCount <= 90 && $('#address3').text().length <= 30) {
$('#address3').append(spacedM[i]+' ');
}
}
$('#address1').append($('#address1').text().length);
$('#address2').append($('#address2').text().length);
$('#address3').append($('#address3').text().length);
//output
Lorem ipsum dolor sit amet, co 31
Lorem ipsum dolor sit amet, co 31
Lorem ipsum dolor sit amet, co 31
看起来不错。但它也是一种黑客攻击。不是吗?我欢迎任何改进此解决方案的建议。由于此代码将用于拆分旧数据的地址,以将其映射到3个地址字段中。以下是我的jsfiddle:https://jsfiddle.net/u11p6xx4/4/
更新: 我不想要分词。因为地址中的单词如果用于1个单词,则不能分成2个部分。因此,当字符小于30但实际上不拆分时,它实际上是拆分地址。字符长度可以是28,然后继续#address2
示例地址:
Blok 53-11-04 Apartment Flamingo, Keramat Jaya 2 Persiaran Gurney
预期:
Blok 53-11-04 Apartment
Flamingo, Keramat Jaya 2
Persiaran Gurney
答案 0 :(得分:1)
为什么不能只使用正则表达式?像:
var m = "Lorem ipsum dolor sit amet, co Lorem ipsum dolor sit amet, co Lorem ipsum dolor sit amet, co Lorem ipsum dolor sit amet, co";
var n = m.match(/.{31}/g);
$('#address1').append(n[0]);
$('#address2').append(n[1]);
$('#address3').append(n[2]);
$('#address1').append($('#address1').text().length);
$('#address2').append($('#address2').text().length);
$('#address3').append($('#address3').text().length);
// output
// Lorem ipsum dolor sit amet, co 31
// Lorem ipsum dolor sit amet, co 31
// Lorem ipsum dolor sit amet, co 31
但是如果第4组匹配会发生什么?你是否忽略了((31 * 3)+1)个字符中的所有内容?
<强>更新强>:
尝试使用此正则表达式/[^\W].{1,30}(?:\s|$)/g
,您仍需要改进它,但它应该让您入门:
var m = "Blok 53-11-04 Apartment Flamingo, Keramat Jaya 2 Persiaran Gurney";
var n = m.match(/.{1,30}(?:\s|$)/g); // or /[^\W].{1,30}(?:\s|$)/g
$('#address1').append(n[0]);
$('#address2').append(n[1]);
$('#address3').append(n[2]);
// output
// Blok 53-11-04 Apartment
// Flamingo, Keramat Jaya 2
// Persiaran Gurney
您可以在此处过期:https://regex101.com/r/TIRa6L/2
如果您不是更可靠的方法,请尝试所谓的“地址验证API”。类似的东西:
它应该能够解析1行地址并将其转换为正确的多行格式。
答案 1 :(得分:0)
像原始帖子一样使用For循环。 尽管截断仍然存在,但不确定您的要求是什么。这段代码不关心截断单词。它只是每30个字符分裂一次。
<!-- goal is to split text when length is 30 including space -->
var m = "Lorem ipsum dolor sit amet, co Lorem ipsum dolor sit amet, co Lorem ipsum dolor sit amet, co Lorem ipsum dolor sit amet, co";
var spacedM = m.split('');
var charCount = 0;
var theString = "";
var theStrings = [];
for(var b=0; b < spacedM.length; b++)
{
theString = theString + spacedM[b];
if(charCount == 29)
{
theStrings.push(theString);//add this string to the array of strings
theString = "";//reset theString
charCount = 0;//reset the charCount
}
charCount++;//increment the charCount
}
for(var i=0; i < theStrings.length ;i++)
{
console.log(theStrings[i]);
}
答案 2 :(得分:0)
可以使用正则表达式来匹配它。 https://regex101.com/r/IszFAZ/1
它可以支持任何长度的最后一个字。
var m = "Lorem ipsum dolor sit amet, c1 Lorem ipsum dolor sit amet, co2 Lorem ipsum dolor sit amet, coo3 Lorem ipsum dolor sit amet, c4";
console.log(m.match(/(?!\s).{30,}?(?=\s|$)/g));