如何包装和排除特定标签

时间:2018-06-20 12:38:34

标签: jquery html dom

我想使用jquery的函数包装,或者使用其他解决方案,但是我需要包装div的内容,并排除诸如<sup> <i> <strong>之类的特定标签。我用下面的例子解释

我有这个:

<div>
   my test without tag<sup>1</sup> and the end of sentence.
   <p>text with tag p <br />
      break line
   </p>
   Second sentence without <i>tag</i> and the end.
<div> 

我想要这样:

<div>
       <p>my test without tag<sup>1</sup> and the end of sentence.</p>
       <p>text with tag p <br />
          break line
       </p>
       <p>Second sentence without <i>tag</i> and the end.<p>
<div> 

所以我在JS中使用JQuery

$( "div" )
   .contents()
   .filter(function(){
      return this.nodeType !== 1;
   })
   .wrap( "<p></p>" );

但是这个JS做到了:

<div>
   <p>my test without tag</p>
   <sup>1</sup>
   <p> and the end of sentence.</p>
   <p>text with tag p <br>
    break line
   </p>
   <p>Second sentence without </p><i>tag</i><p> and the end.</p>
</div>

我创建了这个jsFiddle

3 个答案:

答案 0 :(得分:3)

function wrapElements(elements){
    $(elements).wrapAll('<p></p>');
}

$('div').each(function(){
    var elementsToWrap=[];
    var contents=$(this).contents();
    contents.each(function(){
        if($(this).text().trim()){
            if(this.nodeName!='P'){
                elementsToWrap.push(this);
            }else{
                wrapElements(elementsToWrap)
                elementsToWrap=[];
            }
        }
    });
    if(elementsToWrap.length)
    wrapElements(elementsToWrap);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
   my test without tag<sup>1</sup> and the end of sentence.
   <p>text with tag p <br />
      break line
   </p>
   Second sentence without <i>tag</i> and the end.
</div>

看看上面的代码。它产生正确的输出。但我相信它可以进一步改善。

注意:我使用了P标签来比较该标签是否为段落标签,否则我一直持有它直到得到下一个P标签并将所有包装在{{1}中} 标签。 (可能有很多其他逻辑可以做到这一点)

答案 1 :(得分:1)

基本上,我觉得根本不需要使用curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 。我认为,最好的方法是将html视为String并通过使用RegExp(这是(\ w [uniq tag1 | uniq tag1] \ w)文本的一种)来替换所有出现的内容。

How to replace all occurrences of a string in JavaScript?上查看有关此内容的更多信息

另一个选择是创建递归函数,该函数保留上一个并测试当前节点和下一个节点。通过使用这种功能,您可以创建新的html,然后将其替换为wrap

答案 2 :(得分:1)

考虑到您知道需要用标签换行的文本 您可以执行以下操作

var op = "<div> my test without tag<sup>1</sup> and the end of sentence.<p>text with tag p <br /></p>Second sentence without <i>tag</i> and the end.<div>"
var text = 'my test without tag<sup>1</sup> and the end of sentence.' // The text that you need to wrap around
var re = new RegExp('('+text+')', 'i');
op.replace(re,'<p>$1</p>')