// 代码高亮与代码块保护(支持 [precode]、```围栏、
、)
add_filter('the_content', 'boxmoe_escape_shortcodes_in_code_blocks', 5);
function boxmoe_escape_shortcodes_in_code_blocks($content){
// 处理 ```...``` 围栏
$content = preg_replace_callback('/```(.*?)```/s', function($m){
return '```'.str_replace(array('[',']'), array('[',']'), $m[1]).'```';
}, $content);
// 处理 ...
$content = preg_replace_callback('/(]*>)(.*?)(<\/pre>)/is', function($m){
return $m[1].str_replace(array('[',']'), array('[',']'), $m[2]).$m[3];
}, $content);
// 处理 ...
$content = preg_replace_callback('/(]*>)(.*?)(<\/code>)/is', function($m){
return $m[1].str_replace(array('[',']'), array('[',']'), $m[2]).$m[3];
}, $content);
// 处理 [precode] 内部内容
$content = preg_replace_callback('/\[precode(?:\s[^\]]*)?\](.*?)\[\/precode\]/is', function($m){
return '[precode]'.str_replace(array('[',']'), array('[',']'), $m[1]).'[/precode]';
}, $content);
return $content;
}
add_filter('the_content', 'boxmoe_unescape_code_blocks_after_shortcode', 20);
function boxmoe_unescape_code_blocks_after_shortcode($content){
// 只在 和 内还原实体
$content = preg_replace_callback('/(]*>)(.*?)(<\/pre>)/is', function($m){
return $m[1].str_replace(array('[',']'), array('[',']'), $m[2]).$m[3];
}, $content);
$content = preg_replace_callback('/(]*>)(.*?)(<\/code>)/is', function($m){
return $m[1].str_replace(array('[',']'), array('[',']'), $m[2]).$m[3];
}, $content);
// 处理 ```...``` 围栏还原
$content = preg_replace_callback('/```(.*?)```/s', function($m){
return '```'.str_replace(array('[',']'), array('[',']'), $m[1]).'```';
}, $content);
return $content;
}
add_shortcode('precode', 'precode_shortcode');
function precode_shortcode( $attr , $content = ' ') {
// 把之前转义的实体还原,再做 HTML 转义输出,保证显示原始源码且不执行短代码
$content = html_entity_decode($content, ENT_QUOTES, 'UTF-8');
$out = ''.esc_html($content).'
';
return $out;
}