Как использовать 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 выше мог пройти без преобразования?
Ответы
Ответ 1
Я полагаю, вы могли бы это сделать после факта:
// $str is the result of htmlspecialchars()
preg_replace('#<(/?(?:pre|b|em|u|ul|li|ol))>#', '<\1>', $str);
Он разрешает кодированную версию <xx>
и </xx>
, где xx
находится в контролируемом наборе разрешенных тегов.
Ответ 2
Или вы можете пойти со старым стилем:
$content = htmlspecialchars($_POST['content'], ENT_QUOTES);
$turned = array( '<pre>', '</pre>', '<b>', '</b>', '<em>', '</em>', '<u>', '</u>', '<ul>', '</ul>', '<li>', '</li>', '<ol>', '</ol>' );
$turn_back = array( '<pre>', '</pre>', '<b>', '</b>', '<em>', '</em>', '<u>', '</u>', '<ul>', '</ul>', '<li>', '</li>', '<ol>', '</ol>' );
$content = str_replace( $turned, $turn_back, $content );
Ответ 3
Я улучшил способ, которым Джек атакует эту проблему. Я добавил поддержку тегов <br>, <br/>
и привязки. Код заменит кулак href="..."
, чтобы использовать только этот атрибут.
$str = preg_replace(
array('#href="(.*)"#', '#<(/?(?:pre|a|b|br|em|u|ul|li|ol)(\shref=".*")?/?)>#' ),
array( 'href="\1"', '<\1>' ),
$str
);
Ответ 4
Вы можете использовать strip_tags
$exceptionString = '<pre>,</pre>,<b>,</b>,<em>,</em>,<u>,</u>,<ul>,</ul>,<li>,</li>,<ol>,</ol>';
$content = strip_tags($_POST['content'],$exceptionString );