剪切 HTML 标签并再次包装 HTML 标签 第 1 部分


Cut HTML Tags and wrap HTML tags again Part/1

>我尝试转换以下字符串

 <p>
     string
    <b>
      bold
        <em>italic string</em>
      also(bold)
    </b>
 </p>

到此字符串

 <p>
     string
 </p> <!--------------------------------------- insert -->
    <b>
      bold
    </b> <!------------------------------------ insert -->
        <em>italic string</em>
     <b> <!------------------------------------ insert -->             
      also(bold)
    </b>
 <p> <!---------------------------------------- insert -->
 </p>

我知道这不是有效的 HTML,但我的项目需要这个。...正则表达式是一个很好的方法,但我只是没有得到解决。

整个结构将是动态的,

我的想法是,正则表达式

// open tag close
$regex = '<(.*?)>(.*?)</(.*?)>'
if ($1 != $3) {
$newString = <$1>$2</$1></$3> 
}

但不要工作!

好吧,我认为有效的是两个连续的替换:

1.

^('s*<(?!/))([^<]+)>(?=[^<]+'n)((?:(?!</'2>)['s'S])*?)(?='n *<)(?![^>]*</'2>)

替换为:

$1$2>$3'n$1/$2>

正则表达式101演示

阿拉伯数字。

/[^>]+>$'n'K([^<>]*?)(^'s*)(?=</([^>]+)>)

替换为:

$2<$3>'n$1$2

正则表达式101演示

艾迪恩渲染

我不确定为什么 ideone 将<>变成&lt;&gt;,我不知道如何避免它:(

但这适用于您的样本。

如果你有一个静态字符串,那么你可以在javascript中这样做,

          htmlstring.replace("<b>","</p><b>")
                    .replace("<em>","</b><em>")
                    .replace("</em>","</em><b>")
                    .replace("</b>","</c-b>")
                    .replace("</b>","</b><p>")
                    .replace("</c-b>","</b>");

检查此 http://jsfiddle.net/z5Aba/1/。(需要检查控制台)