我尝试转换跟随字符串
<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>
}
但不起作用!
答案 0 :(得分:0)
嗯,我认为有效的是两次连续替换:
1
^(\s*<(?!/))([^<]+)>(?=[^<]+\n)((?:(?!</\2>)[\s\S])*?)(?=\n *<)(?![^>]*</\2>)
替换为:
$1$2>$3\n$1/$2>
2
/[^>]+>$\n\K([^<>]*?)(^\s*)(?=</([^>]+)>)
替换为:
$2<$3>\n$1$2
我不确定为什么ideone会将<>
变成<
和>
而我不知道如何避免它:(
但这适用于您的样本。
答案 1 :(得分:-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/。 (需要检查控制台)