var str = `
<br><br/>
<Br>
foobar
<span>yay</span>
<br><br>
catmouse
<br>
`;
//this doesn't work but what I have so far
str.replace(/^(<br\s*\/?>)*|(<br\s*\/?>)*$/ig, '');
var desiredOutput = `
foobar
<span>yay</span>
<br><br>
catmouse
`;
我想确保无论是否出现大小写或斜杠,都删除所有<br>
。而且我想保留位于文本中间的所有<br>
。可能还有其他html标签。
编辑:我想指出的是,这将发生在服务器端,因此DOMParser对我不可用。
答案 0 :(得分:2)
我们可以尝试使用以下模式:
^\s*(<br\/?>\s*)*|(<br\/?>\s*)*\s*$
仅当<br>
标签(及其变体)出现在字符串的开头或结尾(可能在某些空格之前/之后)时,此模式才定位它们。
var str = '<br><br/>\n<Br>\nfoobar\n<span>yay</span>\n<br><br>\ncatmouse\n<br>';
console.log(str + '\n');
str = str.replace(/^\s*(<br\/?>\s*)*|(<br\/?>\s*)*\s*$/ig, '');
console.log(str);
请注意,通常不建议使用正则表达式解析HTML。但是在这种情况下,由于您只想从开头和结尾删除平面的非嵌套中断标签,因此正则表达式可能是可行的。
答案 1 :(得分:1)
请勿为此使用正则表达式-正则表达式和HTML解析不能很好地协同工作。即使使用正则表达式可能,我还是建议使用DOMParser
代替;将文本转换为文档,并遍历第一个和最后一个节点,并在tagName
为BR
时将其删除(如果存在空白文本节点,也将其删除):
var str = `
<br><br/>
<Br>
foobar
<span>yay</span>
<br><br>
catmouse
<br>
`;
const body = new DOMParser().parseFromString(str.trim(), 'text/html').body;
const nodes = [...body.childNodes];
let node;
while (node = nodes.shift(), node.tagName === 'BR') {
node.remove();
const next = nodes[0];
if (next.nodeType === 3 && next.textContent.trim() === '') nodes.shift().remove();
}
while (node = nodes.pop(), node.tagName === 'BR') {
node.remove();
const next = nodes[nodes.length - 1];
if (next.nodeType === 3 && next.textContent.trim() === '') nodes.pop().remove();
}
console.log(body.innerHTML);
请注意,如果您不必担心空文本节点,或者不关心HTML输出中是否有空文本节点,那么操作会容易得多。
答案 2 :(得分:0)
尝试
/^(\s*<br\s*\/?>)*|(<br\s*\/?>\s*)*$/ig