我有一个类似于"<p></p>"
的字符串。现在,我想拆分这个字符串,所以我有2个标签。如果我做
var arr = "<p></p>".split("><")
,我得到一个看起来像
["<p", "/p>"]
是否有一种简单的方法可以将分隔符保留在此拆分中?不是我想要的REGEX(不是骗局):
["<p>","</p>"]
答案 0 :(得分:1)
由于javascript正则表达式不支持断言,因此使用String#split
方法是不可能的。使用String#match
方法获取完整的字符串。
var arr = "<p></p>".match(/[\s\S]+?>(?=<|$)/g)
console.log(arr)
如果没有正则表达式并使用拆分,您可以执行类似的操作。
var arr = "<p></p>".split('><').map(function(v, i, arr1) {
if (i != 0)
v = '<' + v;
if (i < arr1.length - 1)
v += '>';
return v;
})
// using ternary
var arr1 = "<p></p>".split('><').map(function(v, i, arr1) {
return (i != 0 ? '<' : '') + v + (i < arr1.length - 1 ? '>' : '');
})
console.log(arr);
console.log(arr1);
答案 1 :(得分:0)
要在没有正则表达式的情况下执行此操作,您需要某种解析器。检查每个角色,构建块并将它们存储在一个数组中。然后,您可能希望处理这些位,寻找令牌或进行其他处理。 E.g。
/* Break string into chunks of <...>, </...> and anything in between.
** @param {string} s - string to parse
** @returns {Array} chunks of string
*/
function getChunks(s) {
var parsed = [];
var limit = s.length - 1;
s.split('').reduce(function(buffer, char, i) {
var startTag = char == '<';
var endTag = char == '/';
var closeTag = char == '>';
if (startTag) {
if (buffer.length) {
parsed.push(buffer);
}
buffer = char;
} else if (endTag) {
buffer += char;
} else if (closeTag) {
parsed.push(buffer + char)
buffer = '';
} else {
buffer += char;
}
if (i == limit && buffer.length) {
parsed.push(buffer);
}
return buffer;
}, '');
return parsed;
}
['<p></p>',
'<div>More complex</div>',
'<span>broken tag</sp'
].forEach(function(s){
console.log(s + ' => [' + getChunks(s) + ']')
});
&#13;
请注意,这非常简单,只需查找<...>
和</...>
,其中...
可以是任何内容。