正则表达式修剪字符串中的所有<br/>,而忽略换行符和空格

时间:2018-10-17 04:25:36

标签: regex

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对我不可用。

3 个答案:

答案 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代替;将文本转换为文档,并遍历第一个和最后一个节点,并在tagNameBR时将其删除(如果存在空白文本节点,也将其删除):

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