Как использовать htmlspecialchars, но разрешить только конкретный код HTML без преобразования?

Вот строка кода, который у меня есть, который отлично работает:

$content = htmlspecialchars($_POST['content'], ENT_QUOTES); 

Но то, что я хотел бы сделать, это разрешить передачу только определенных типов HTML-кода без преобразования. Вот список HTML-кода, который я хотел бы передать:

 <pre> </pre> <b> </b> <em> </em> <u> </u> <ul> </ul> <li> </li> <ol> </ol> 

И по мере того как я иду, я хотел бы также иметь возможность добавить в более HTML позже, как я думаю об этом. Может ли кто-нибудь помочь мне изменить вышеприведенный код, чтобы указанный список кодов HTML выше мог пройти без преобразования?

Я полагаю, вы могли бы это сделать после факта:

 // $str is the result of htmlspecialchars() preg_replace('#&lt;(/?(?:pre|b|em|u|ul|li|ol))&gt;#', '<\1>', $str); 

Он позволяет кодированную версию <xx> и </xx> где xx находится в контролируемом наборе разрешенных тегов.

Или вы можете пойти со старым стилем:

 $content = htmlspecialchars($_POST['content'], ENT_QUOTES); $turned = array( '&lt;pre&gt;', '&lt;/pre&gt;', '&lt;b&gt;', '&lt;/b&gt;', '&lt;em&gt;', '&lt;/em&gt;', '&lt;u&gt;', '&lt;/u&gt;', '&lt;ul&gt;', '&lt;/ul&gt;', '&lt;li&gt;', '&lt;/li&gt;', '&lt;ol&gt;', '&lt;/ol&gt;' ); $turn_back = array( '<pre>', '</pre>', '<b>', '</b>', '<em>', '</em>', '<u>', '</u>', '<ul>', '</ul>', '<li>', '</li>', '<ol>', '</ol>' ); $content = str_replace( $turned, $turn_back, $content ); 

Я улучшил способ, которым Джек атакует эту проблему. Я добавил поддержку для <br>, <br/> и якорных тегов. Код заменит fist href=&quot;...&quot; чтобы использовать только этот атрибут.

 $str = preg_replace( array('#href=&quot;(.*)&quot;#', '#&lt;(/?(?:pre|a|b|br|em|u|ul|li|ol)(\shref=".*")?/?)&gt;#' ), array( 'href="\1"', '<\1>' ), $str ); 

Вы можете использовать strip_tags

 $exceptionString = '<pre>,</pre>,<b>,</b>,<em>,</em>,<u>,</u>,<ul>,</ul>,<li>,</li>,<ol>,</ol>'; $content = strip_tags($_POST['content'],$exceptionString );