WordPress 使用 code 或 pre 标签插入代码演示,避免被 HTML 标签过滤

编辑于:2021年12月18日
WordPress 使用 code 或 pre 标签插入代码演示,避免被 HTML 标签过滤

WordPress 自身有一个强大的 HTML 标签过滤系统,会导致在文章和评论中插入的 PHP、CSS、HTML、JS 等代码直接消失,因此需要将codepre内的符号标签编码转义为 HTML 实体。

参考一

/**
 * 转换 code 标签中的 html 代码
 * WordPress 如何在文章和评论中插入代码 - 龙笑天下
 * https://www.ilxtx.com/html-entities-of-code-fragments-in-posts-and-comments.html
 */
add_filter('pre_comment_content', 'lxtx_encode_code_in_posts_comments');
add_filter('the_content', 'lxtx_encode_code_in_posts_comments');
function lxtx_encode_code_in_posts_comments($source) {
  $encoded = preg_replace_callback('/<code>(.*?)<\/code>/ims',
  create_function(
    '$matches',
    '$matches[1] = preg_replace(
        array("/^[\r|\n]+/i", "/[\r|\n]+$/i"), "",
        $matches[1]);
      return "<code>" . esc_html( $matches[1] ) . "</code>";'
  ),
  $source);
  if ($encoded)
    return $encoded;
  else
    return $source;
}

参考二:

/**
 * 转换 pre 标签中的html代码
 * 使用'the_content'钩子.
 * @author c.bavota
 * https://blog.csdn.net/tianqixin/article/details/8902677
 */
add_filter( 'the_content', 'pre_content_filter', 0 );

function pre_content_filter( $content ) {
	return preg_replace_callback( '|<pre.*>(.*)</pre|isU' , 'convert_pre_entities', $content );
}

function convert_pre_entities( $matches ) {
	return str_replace( $matches[1], htmlentities( $matches[1] ), $matches[0] );
}

参考三:

/**
 * 转换 code 标签中的 html 代码
 * https://gitcafe.net/archives/3693.html
 */
add_filter('pre_comment_content', 'encode_code_in_comment');

function encode_code_in_comment($source) {
	$encoded = preg_replace_callback('/<code>(.*?)<\/code>/ims',
	create_function('$matches', '$matches[1] = preg_replace(array("/^[\r|\n]+/i", "/[\r|\n]+$/i"), "", $matches[1]); 
	return "<code>" . htmlentities($matches[1]) . "</"."code>";'), $source);
	if ($encoded)
		return $encoded;
	else
		return $source;
}


//转换 pre 标签中的 html 代码
//文章和评论
function meow_prettify_esc_html($content){
    $regex = '/(<pre\s+[^>]*?class\s*?=\s*?[",\'].*?prettyprint.*?[",\'].*?>)(.*?)(<\/pre>)/sim';
    return preg_replace_callback($regex, 'meow_prettify_esc_callback', $content);}
function meow_prettify_esc_callback($matches){
    $tag_open = $matches[1];
    $content = $matches[2];
    $tag_close = $matches[3];
    $content = esc_html($content);
    return $tag_open . $content . $tag_close;}
add_filter('the_content', 'meow_prettify_esc_html', 2);
add_filter('comment_text', 'meow_prettify_esc_html', 2);

pre 和 code 可以根据需要修改代码中的正规则匹配

相关推荐