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

default-widgets.php line 550:

1
        <li><a href="<?php the_permalink() ?>" title="<?php echo esc_attr(get_the_title() ? get_the_title() : get_the_ID()); ?>"><?php if ( get_the_title() ) the_title(); else the_ID(); ?></a></li>

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

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

1
<?php echo esc_attr(strip_tags(get_the_title() ? get_the_title() : get_the_ID())); ?>

然后又看了下esc_attr函数,

1
2
3
4
5
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的,因此,上面的方案又可以修改了。

1
2
3
4
5
6
7
//something like &lt;span style=&quot;color: rgb(121, 6, 25);&quot; &gt;最近文章title属性去除HTML标签&lt;/span&gt;
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后,一些字符可能会出现乱码。如果写成这样就安全了,不过效率上我不怎么喜欢,有些事情做了两遍:

1
2
3
4
5
6
7
8
9
//something like &lt;span style=&quot;color: rgb(121, 6, 25);&quot; &gt;最近文章title属性去除HTML标签&lt;/span&gt;
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);


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

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

更多
No Responses Post a comment

Leave a Reply

Note: You may use basic HTML in your comments. Your email address will not be published.

Subscribe to this comment feed via RSS