2

我尝试转换以下字符串

 <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> 
}

但不工作!

4

2 回答 2

0

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

1.

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

替换为:

$1$2>$3\n$1/$2>

正则表达式101演示

2.

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

替换为:

$2<$3>\n$1$2

正则表达式101演示

ideone渲染

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

但这适用于您的样本。

于 2013-09-27T07:35:13.270 回答
-1

如果你有一个静态字符串,那么你可以在 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/。(需要检查控制台)

于 2013-09-27T07:08:17.473 回答