>我尝试转换以下字符串
<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 将<>
变成<
和>
,我不知道如何避免它:(
但这适用于您的样本。
如果你有一个静态字符串,那么你可以在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/。(需要检查控制台)