首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将<br>标签转换为<Div>或<P>标签

将<br>标签转换为<Div>或<P>标签
EN

Stack Overflow用户
提问于 2013-08-29 01:23:10
回答 5查看 3.4K关注 0票数 3

我收到了各种格式的超文本标记语言,我正在尝试使用jQuery来标准化代码。在某些情况下,我使用breaks <br>分隔行来接收它。我需要这些是<div> (或<p>)标签。例如,下面的代码:

代码语言:javascript
运行
复制
a<br>b<br>c

需要转换为

代码语言:javascript
运行
复制
<div>a</div><div>b</div><div>c</div>

这是一个简单的例子,因为a中的内容可能被各种类型的<font><span>和其他格式选项包围,所有这些都需要保留。

这是我的第一次尝试。它查找整个文档中的所有<br>标记,然后访问父文档的内容以获取<br>周围的所有HTML。如果内容长度为1,则<br>是其中唯一的元素(即空白行),因此跳到下一个元素。否则,查看每个元素,用<div> (或<p>)将其括起来,然后删除不再需要的<br>。变量wrapper可以是"<div />",也可以是"<p />",具体取决于浏览器。

代码语言:javascript
运行
复制
$("br").each(function() {
  // Find all the br tags' parent nodes
  var elements = $(this).parent().contents();
  if (elements.length > 1) {
    // If there is one element than it is br so skip on.
    elements.each(function() {
      // Loop through each child element of the parent 
      var nodeName = this.nodeName.toLowerCase();
      if (nodeName !== 'div' && nodeName !== 'p') {
      // Make sure each child that is not <br> is wrapped. Remove <br> tags.
        if (nodeName == 'br') {
          $(this).remove();
        } else {
          $(this).wrap(wrapper);
        }
      }
    });
  }
});

但是,这并不起作用,因为它在每个子元素周围添加了<div> (或<p>)标记,所以像<font>a</font>bc<br>de<b>f</b>这样的东西最终会变成这样

代码语言:javascript
运行
复制
<div><font>a</font></div>
<div>bc</div>
<div>de</div>
<div><b>f</b></div>

当它真正需要的时候

代码语言:javascript
运行
复制
<div><font>a</font>bc</div>
<div>de<b>f</b></div>

(为了更容易阅读,我把它拆开了。)

如果我在文本解析器中这样做,我会像上面对变量elements所做的那样查找内容,在开头添加一个<div>,在末尾添加一个</div>,然后用</div><div>替换每个<br> (除非它已经是<div><br></div>,这时我会跳过它)。我不知道如何在jQuery/Javascript中做到这一点。但是,特别是关于用</div><div>替换<br>部分。(第一部分是elements.wrap(wrapper)。)

任何关于此方法或替代方法的帮助都将不胜感激。

-更新

@Ian提供了运行正常的代码的必备部分。我稍微扩展了一下,我想我应该把它包括在这里。我已经在FF,Safari,Chrome和IE 9+上测试过了。

代码语言:javascript
运行
复制
$("br").each(function(idx, el) {
    var $el = $(el),
        $parent = $el.parent(),
        $contents = $parent.contents(),
        $cur, $set, i;

    $set = $();
        if ($contents.length > 1) {
        for (i = 0; i < $contents.length; i++) {
            $cur = $contents.eq(i);

            if ($cur.is("br")) {
                $set.wrapAll(wrapper);
                $cur.remove();
                $set = $();
            } else {
                $set = $set.add($cur);
            }
        }
        $set.wrapAll(wrapper);
    }
});
EN

Stack Overflow用户

发布于 2013-08-29 01:31:17

我的建议是按<br>拆分文本:

代码语言:javascript
运行
复制
var lines = content.split("<br>");

现在您可以将每一行包装在一个<div>

代码语言:javascript
运行
复制
var newContent = "";
for(var i=0,l=lines.length;i<l;i++){
     newContent += "<div>"+lines[i]+"</div>";

}
票数 6
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18494385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档