/*
* 调整截取的字符串的位置。因为在截取一个字符串后可能存在两种情况:
* (1)字符串末位正好处于一个标签的属性之中的某个位置。如:<a id="xxx" href="xxx"
></a>中红色标注的位置。
* (2)字符串末位处于一个标签内容之中的某个位置。如:<a
>here
</a> 中红色标注的位置。
* 对于这两种情况,第二种情况可以无需特殊处理,但是第一种情况的话得将整个标签删除或者将其属性补全。删除的话
* 将字符串的末尾位置前移至标签开始之前;而补全则是将末尾位置后移至次标签的'>'处。这里采用的是删除的方法。
*/
function adjustByTagPostion(str){
var left_brace_index = str.lastIndexOf('<');
var right_brace_index = str.lastIndexOf('>');
// 为true的话则表示字符串处于第一种情况,需要进行删除操作。
var inTagDefinition = left_brace_index > right_brace_index;
return inTagDefinition ? str.substring(0,left_brace_index) : str;
}
// 将未闭合的标签按序闭合。
function modifyDisplayString(original, addTags){
var tagLenth = addTags.length;
for(var i = tagLenth-1; i >= 0; i--){
original += '</' + addTags[i] + '>';
}
return original;
}
//
function splitString(original, length){
// 此数组用于保存那些未闭合的标签。
var non_match_tag = []
// 如果大于字符串的总长度,返回整个字符串;否则返回指定长度的子串
var to = length >= original.length ? original.length : length;
var substring = original.substring(0,to);
// 调整字符串。
adjustedSubString = adjustByTagPostion(substring);
var tag_pattern = /<\s*(\w+\b)(?:[^>]*[^\/])?>|<(\/\w+)>/ig
adjustedSubString.replace(tag_pattern, function(match,$1,$2){
var value = $1 == '' ? ($2 == '' ? '' : $2) : $1;
if(value.charAt(0) == '/'){
// 为真表示这个标签是前面最后一个为闭合标签的闭合,因此,将此标签从数组中删除。
if(non_match_tag.length > 0 && non_match_tag[non_match_tag.length-1] == value.substring(1)){
non_match_tag.pop();
}
}else{
// 新的未闭合的标签,将其添加到数组中。
non_match_tag.push(value);
}
});
return modifyDisplayString(adjustedSubString, non_match_tag);
}