2016-02-19 3 views
0

В WordPress, wp_kses() функция удаляет HTML-теги и атрибуты, кроме дозволенных:wp_kses() не допускает подчеркивание

$post = "<p class="sample">This is a picture.<img src="sample.jpg" height="333"/><br/></p>"; 
$allowed = array(
    "p" => array(), 
    "img" => array(
     "src" => array() 
    ), 
); 
echo wp_kses($post, $allowed); 
> <p>This is a picture.<img src="sample.jpg"/></p> 

Однако, я не могу позволить атрибуты, включая знак подчеркивания:

$post = "<p class="sample">This is a picture.<img src="sample.jpg" height="333" under_bar="some" /><br/></p>"; 
$allowed = array(
    "p" => array(), 
    "img" => array(
     "src" => array(), 
     "under_bar" => array() 
    ), 
); 
echo wp_kses($post, $allowed); 
> <p>This is a picture.<img src="sample.jpg"/></p> 

Я знаю, что должен использовать другие имена, но я хочу знать, как использовать нижний барабан.

Заранее спасибо.

ответ

0

Я уверен, что нет решения для этого, по крайней мере, не используя wp_kses() в его форме. Если вы посмотрите на the code, вы увидите, что WordPress, в certain point, разбирает атрибут under_bar="some" с этим, чтобы получить имя атрибута и, позже, его значение:

if (preg_match('/^([-a-zA-Z:]+)/', $attr, $match)) { 
    $attrname = $match[1]; 
    $working = $mode = 1; 
    $attr = preg_replace('/^[-a-zA-Z:]+/', '', $attr); 
} 

Выражаясь ясно, что это используя регулярное выражение, чтобы получить имя атрибута, и оно не принимает знак подчеркивания. В результате он продолжает думать, что ваш атрибут называется under и не может найти его в списке разрешенных тегов (и даже если он его найдет, остальное, вероятно, не сработает, получив неправильное имя).

Проще всего сделать, возможно, просто используя тире. Вы можете попробовать умное использование фильтрующих крючков, чтобы сделать что-то другое с wp_kses(), но я думаю, что это было бы в основном как переписывание всего.

+0

Спасибо! Я понял, почему я не могу использовать символ подчеркивания. Знаете ли вы, что произойдет, если вы используете атрибуты, не определенные W3C? (Я знаю, что это еще один вопрос) – karadaharu

+0

Насколько я знаю, ничего особенного, кроме вашей страницы, будет недействительным HTML (но, скорее всего, это будет работать в любом случае). Определенно пойти на другой ответ, хотя, или лучше увидеть, если он уже ответил где-то. – Aioros

+0

ОК, спасибо вам в любом случае. – karadaharu

0

Это вполне возможно. Вот пример;

<?php 

          $row_content = '<i class="fa fa-twitter" aria-hidden="true"></i>'; 
          $allowed_html = array(

           'i' => array(
            'class' => array(), 
            'href' => array(), 
            'rel' => array(), 
            'title' => array(), 
            'aria-hidden' => array() 
           ) 
          ); 

          ?> 

          <?php echo wp_kses($row_content, $allowed_html); ?> 
Смежные вопросы