【问题标题】:Leading and Trailing <br> removal前导和尾随 <br> 删除
【发布时间】:2014-09-23 15:43:59
【问题描述】:

我有类似的字符串表达式

<br /><br /><br/ >this is <br /><br /><br/ > a test<br /><br /><br/ ><br> 

我只需要使用纯 javascript 删除第一组和最后一组 &lt;br /&gt; 标记。

【问题讨论】:

  • 一般来说,在 SO 上,您需要一些需要帮助的工作代码。仅仅要求社区提供解决方案并不是 SO 的意图。
  • 道歉弗兰克!.. 将确保今后!
  • 请考虑选择下面的正确答案。已经有 4 个答案了。

标签: javascript regex


【解决方案1】:

如果在全局范围内执行,这将匹配所有前导换行符和所有尾随换行符(以及之前/之后的空格,如果您想保留前导/尾随空格,请告诉我):

^\s*(?:<br\s*\/?\s*>)+|(?:<br\s*\/?\s*>)+\s*$

像这样使用它:

var regex = /^\s*(?:<br\s*\/?\s*>)+|(?:<br\s*\/?\s*>)+\s*$/gi,
    string = '   <br /><br /><br/ >this is <br /><br /><br/ > a test<br /><br /><br/ ><br> ';

string = string.replace(regex, ''); //changed replacement
console.log(string);
&lt;script src="https://getfirebug.com/firebug-lite-debug.js"&gt;&lt;/script&gt;

【讨论】:

  • 我添加了一个* 量词,因为他想删除&lt;br&gt; 元素的前导和尾随sets。谢谢
  • 谢谢@Php-dev,我误读了这个问题。我改进了你的编辑,在斜线后面有 0+ 个空格,因为他有一些这样的例子。
  • 谢谢 Sam!.. 但是我想删除
    标签的第一个和最后一个 sets ,根据您的示例,它同时删除了一个
    标签开始和结束。
  • @DavidR,我的错。我已经更新了。您可能还需要一项潜在的调整(当前正在修剪前导/尾随空格),请告诉我:)
【解决方案2】:

与其尝试使用正则表达式处理 HTML(即使看起来无害,这也不是一个好主意),不如考虑使用 CSS 中和 br 标签。

br { display: none; }

Ignore <br> with CSS?

如果要压缩多个br标签,那么

br + br { display: none; }

在您的特定情况下,CSS 无法检测 br 是否出现在元素的开头或结尾。所以这里有一点 JavaScript。一般来说,最好使用 DOM API 像这样操作 DOM,而不是在 DOM 的字符串表示上使用正则表达式:

function removeLeadingTrailingBRs(elt) {
    var node;
    while (node=elt.querySelector('br:first-child')) { elt.deleteChild(node); }
    while (node=elt.querySelector('br:last-child'))  { elt.deleteChild(node); }
}

或者,如果您是保理的忠实拥护者:

function deleteBySelector(elt, selector) {
    var node;
    while (node=elt.querySelector(selector)) { elt.deleteChild(node); }
}
function remoteLeadingTrailingBRs(elt) {
    deleteBySelector('br:first-child');
    deleteBySelector('br:last-child');
}

【讨论】:

    【解决方案3】:

    您可以使用以下正则表达式:

    /^\s*<br\s*\/?\s*>|<br\s*\/?\s*>\s*$/ig
    

    用空字符串替换它:

    '   <br /><br /><br/ >this is <br /><br /><br/ > a test<br /><br /><br/ ><br> '.replace(/^\s*<br\s*\/?\s*>|<br\s*\/?\s*>\s*$/ig, '')
    // => "<br /><br/ >this is <br /><br /><br/ > a test<br /><br /><br/ >"
    

    更新

    删除多次出现:

    /^\s*(<br\s*\/?\s*>)+|(<br\s*\/?\s*>)+\s*$/ig
    

    '   <br /><br /><br/ >this is <br /><br /><br/ > a test<br /><br /><br/ ><br> '.replace(/^\s*(<br\s*\/?\s*>)+|(<br\s*\/?\s*>)+\s*$/ig, '')
    // => "this is <br /><br /><br/ > a test"
    

    【讨论】:

      【解决方案4】:

      我终于找到了解决方案。以下是对我有用的正则表达式。

          /^[<br>]*\s*[<br>]*|[<br>]*$/g 
      

      感谢大家的帮助!

      【讨论】:

      • 那个正则表达式没有意义。 [&lt;br&gt;] 匹配 &lt; OR b OR r OR &gt;,不一定是 &lt;br&gt; 标签。
      猜你喜欢
      • 2017-08-03
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 2021-12-29
      • 2012-02-28
      • 1970-01-01
      • 2020-08-20
      • 2018-10-04
      相关资源
      最近更新 更多