я пытаюсь преобразовать строку follow
<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>
того<p> string </p> <!--------------------------------------- insert --> <b> bold </b> <!------------------------------------ insert --> <em>italic string</em> <b> <!------------------------------------ insert --> also(bold) </b> <p> <!---------------------------------------- insert --> </p>
выделено<p> string </p> <!--------------------------------------- insert --> <b> bold </b> <!------------------------------------ insert --> <em>italic string</em> <b> <!------------------------------------ insert --> also(bold) </b> <p> <!---------------------------------------- insert --> </p>
Я знаю, что это неверный html, но мне это нужно для моего проекта. … regex это хороший способ, но я просто не решаюсь.
вся структура будет динамичной,
мое мышление было, регулярное выражение
// 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>
regex101 demo
2.
/[^>]+>$\n\K([^<>]*?)(^\s*)(?=</([^>]+)>)
Заменить на:
$2<$3>\n$1$2
regex101 demo
ideone render
Я не уверен, почему идеон превращает <>
в <
и >
и я не знаю, как этого избежать 🙁
Но это работает с вашим образцом.
Если у вас есть статическая строка, вы можете сделать это как таковое в javascript,
htmlstring.replace("<b>","</p><b>") .replace("<em>","</b><em>") .replace("</em>","</em><b>") .replace("</b>","</cb>") .replace("</b>","</b><p>") .replace("</cb>","</b>");
Проверьте это http://jsfiddle.net/z5Aba/1/ . (Необходимо проверить консоль)