最近文章title属性去除HTML标签 » 荒野无灯weblog

Keep It Simple, Stupid.

荒野无灯weblog

最近文章title属性去除HTML标签

default-widgets.php line 550:

        
  • 属性处未过滤html标签.
    查看下the_title_attribute函数的源码会发现这个函数是过滤了的~~~
    因此,手动修复它吧,如果为了这个自己重新写一个最近文章的widget,划不来~~~,能偷懒则偷。

    因为get_the_title会应用the_title勾子,如果我在the_title HOOK函数中写入HTML代码,此时,显示的东西就不是我们想要的。

    
    

    然后又看了下esc_attr函数,

    function esc_attr( $text ) {
        $safe_text = wp_check_invalid_utf8( $text );
        $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
        return apply_filters( 'attribute_escape', $safe_text, $text );
    }
    

    发现它是可HOOK的,因此,上面的方案又可以修改了。

    
    //something like <span style="color: rgb(121, 6, 25);" >最近文章title属性去除HTML标签</span>
    function strip_all_attribute_tags($safe_text, $text )
    {
        $safe_text = html_entity_decode( $safe_text, ENT_QUOTES );
        return strip_tags($safe_text);
    }
    add_filter('attribute_escape', 'strip_all_attribute_tags',99, 2);
    

    这样行了吗?有些问题
    经html_entity_decode后,一些字符可能会出现乱码。如果写成这样就安全了,不过效率上我不怎么喜欢,有些事情做了两遍:

    
    //something like <span style="color: rgb(121, 6, 25);" >最近文章title属性去除HTML标签</span>
    function strip_all_attribute_tags($safe_text, $text )
    {
        $safe_text = wp_check_invalid_utf8( $text );
            $safe_text = strip_tags($safe_text);
        $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );
        return $safe_text;
    }
    add_filter('attribute_escape', 'strip_all_attribute_tags',99, 2);
    


    最后,决定采取特殊问题特殊化的策略:

    //由于最后生成的title内容形如
    //<span style="color: rgb(121, 6, 25);" >最近文章title属性去除HTML标签</span>
    //其实这里用strpos截取也是可以的,不过我没有测试二者的实际速度相差有多大。不用正则,太耗费时间
    function strip_all_attribute_tags($safe_text, $text )
    {
        $safe_text = str_replace( 
            array('<span style="','" >','</span>'),
        array('',''),
        $safe_text);
        return strip_tags($safe_text);
    }
    add_filter('attribute_escape', 'strip_all_attribute_tags',99, 2);
    

    Tagged in : wp问题

    All Comments (0)
    Gravatar image
    No Comments