Мне нравится удалять пустой пустой тег html, который пуст или содержит пробелы.
что-то вроде получить:
$string = "<b>text</b><b><span> </span></b><p> <br/></p><b></b><font size='4'></font>";
чтобы:
$string ="<b>text</b>=;
Вот подход с DOM :
// init the document $dom = new DOMDocument; $dom->loadHTML($string); // fetch all the wanted nodes $xp = new DOMXPath($dom); foreach($xp->query('//*[not(node()) or normalize-space() = ""]') as $node) { $node->parentNode->removeChild($node); } // output the cleaned markup echo $dom->saveXml( $dom->getElementsByTagName('body')->item(0) );
Это приведет к чему-то вроде
<body><b>text</b></body>
XML-документам нужен корневой элемент, поэтому его невозможно исключить. Вы можете str_replace
хотя. Вышеупомянутое может обрабатывать разбитый HTML.
Если вы хотите выборочно удалить определенные узлы, отрегулируйте запрос XPath.
Также см
function stripEmptyTags ($result) { $regexps = array ( '~<(\w+)\b[^\>]*>\s*</\\1>~', '~<\w+\s*/>~' ); do { $string = $result; $result = preg_replace ($regexps, '', $string); } while ($result != $string); return $result; } $string = "<b>text</b><b><span> </span></b><p> <br/></p><b></b><font size='4'></font>"; echo stripEmptyTags ($string);
Вам нужно будет запустить код несколько раз, чтобы сделать это только с регулярными выражениями.
регулярное выражение, которое делает это:
/<(?:(\w+)(?: [^>]*)?`> *<\/$1>)|(?:<\w+(?: [^>]*)?\/>)/g
Но, например, на вашей строке вы должны запустить ее хотя бы дважды. Как только он удалит <br/>
а второй раз удалит оставшиеся <p> </p>
.