剪切HTML标签并再次包装HTML标签Part / 1

时间:2013-09-27 06:53:16

标签: php html regex

我尝试转换跟随字符串

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

但不起作用!

2 个答案:

答案 0 :(得分:0)

嗯,我认为有效的是两次连续替换:

1

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

替换为:

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

regex101 demo

2

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

替换为:

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

regex101 demo

ideone render

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

但这适用于您的样本。

答案 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/。 (需要检查控制台)