织梦自动过滤清除文章内section标签样式的方法

作者 : Maria Orlova 发布时间: 2021-04-2 共38人阅读

在用织梦做站的时候,经常会遇到比较懒的客户添加内容的时候,直接从微信公账号复制文章到后台编辑器里,有些客户微信公众号的文章是网络编辑排版直接制作,导致里面有很多的“section”标签,默认加了style样式,这样就搞的非常不方便,电脑端显示正常的内容在手机端却不显示,找了很久的原因,才发现是“section”标签自带的style样式导致的,用一个很简单的方法把这个问题给规避;

过滤代码为:

{dede:field.body runphp=yes}
@me = preg_replace('/<section.*?style=".*?"/', '<section',@me);
{/dede:field.body}

以上标签就是过滤“section”里面的style样式的,若是需要过滤P标签,写法就是“@me = preg_replace('/<p.*?style=".*?"/', '<p',@me);”,可以扩展很多,比如div、span等等,
========================================
如果想把整个<div>都过滤掉,可以这样写:

{dede:field.body runphp=yes}
@me = preg_replace('/<div([^>]*)>/i', '',@me);
@me = preg_replace('/<\/div>/i', '',@me);
{/dede:field.body}

若有更多的标签需要整个过滤的,就需要把代码里面的div修改成自己的标签即可,亲测可用。

拓展阅读资料,以下代码是清理body内容中图片自带的style标签样式:

{dede:field.body runphp=yes}
global $cfg_basehost;
$str = @me;
$search = '/(<img.*?)width=(["\'])?.*?(?(2)\2|\s)([^>]+>)/is';
$search1 = '/(<img.*?)height=(["\'])?.*?(?(2)\2|\s)([^>]+>)/is';
$search2 = '#(<img.*?style=".*?)width:\d+px;([^"]*?.*?>)#i';
$search3 = '#(<img.*?style=".*?)height:\d+px;([^"]*?.*?>)#i';
$content = preg_replace($search,'$1$3',$str);
$content = preg_replace($search1,'$1$3',$content);
$content = preg_replace($search2,'$1$2',$content);
$content = preg_replace($search3,'$1$2',$content);
@me = $content;
//@me = str_replace('/uploads/allimg/', $cfg_basehost.'/uploads/allimg/', $content);//手机版图片使用绝对路径
{/dede:field.body}

文章的body字段屏蔽a标签和iframe标签:

{dede:field.body runphp="yes"}
    $str=@me;
    @me='';
    $str1='';
    $str1 = preg_replace( "@<iframe(.*?)</iframe>@is", "", $str ); 
    $str1 = preg_replace("/<a[^>]*>(.*?)<\/a>/is", "$1", $str1);
    @me=$str1;
{/dede:field.body}

以下是过滤其他标签的正则表达式:

$str=preg_replace("/\s+/", " ", $str); //过滤多余回车
$str=preg_replace("/<[ ]+/si","<",$str); //过滤<__("<"号后面带空格)
$str=preg_replace("/<\!–.*?–>/si","",$str); //注释
$str=preg_replace("/<(\!.*?)>/si","",$str); //过滤DOCTYPE
$str=preg_replace("/<(\/?html.*?)>/si","",$str); //过滤html标签
$str=preg_replace("/<(\/?br.*?)>/si","",$str); //过滤br标签
$str=preg_replace("/<(\/?head.*?)>/si","",$str); //过滤head标签
$str=preg_replace("/<(\/?meta.*?)>/si","",$str); //过滤meta标签
$str=preg_replace("/<(\/?body.*?)>/si","",$str); //过滤body标签
$str=preg_replace("/<(\/?link.*?)>/si","",$str); //过滤link标签
$str=preg_replace("/<(\/?form.*?)>/si","",$str); //过滤form标签
$str=preg_replace("/cookie/si","COOKIE",$str); //过滤COOKIE标签
$str=preg_replace("/<(applet.*?)>(.*?)<(\/applet.*?)>/si","",$str); //过滤applet标签
$str=preg_replace("/<(\/?applet.*?)>/si","",$str); //过滤applet标签
$str=preg_replace("/<(style.*?)>(.*?)<(\/style.*?)>/si","",$str); //过滤style标签
$str=preg_replace("/<(\/?style.*?)>/si","",$str); //过滤style标签
$str=preg_replace("/<(title.*?)>(.*?)<(\/title.*?)>/si","",$str); //过滤title标签
$str=preg_replace("/<(\/?title.*?)>/si","",$str); //过滤title标签
$str=preg_replace("/<(object.*?)>(.*?)<(\/object.*?)>/si","",$str); //过滤object标签
$str=preg_replace("/<(\/?objec.*?)>/si","",$str); //过滤object标签
$str=preg_replace("/<(noframes.*?)>(.*?)<(\/noframes.*?)>/si","",$str); //过滤noframes标签
$str=preg_replace("/<(\/?noframes.*?)>/si","",$str); //过滤noframes标签
$str=preg_replace("/<(i?frame.*?)>(.*?)<(\/i?frame.*?)>/si","",$str); //过滤frame标签
$str=preg_replace("/<(\/?i?frame.*?)>/si","",$str); //过滤frame标签
$str=preg_replace("/<(script.*?)>(.*?)<(\/script.*?)>/si","",$str); //过滤script标签
$str=preg_replace("/<(\/?script.*?)>/si","",$str); //过滤script标签
$str=preg_replace("/javascript/si","Javascript",$str); //过滤script标签
$str=preg_replace("/vbscript/si","Vbscript",$str); //过滤script标签
$str=preg_replace("/on([a-z]+)\s*=/si","On\\1=",$str); //过滤script标签
$str=preg_replace("/&#/si","&#",$str); //过滤script标签,

$str = preg_replace( "@<script(.*?)</script>@is", "", $str ); //过滤script代码
$str = preg_replace( "@<iframe(.*?)</iframe>@is", "", $str );
$str = preg_replace( "@<style(.*?)</style>@is", "", $str );
$str = preg_replace( "@<(.*?)>@is", "", $str ); 

=============================================

当然,在后台编辑里被过滤的代码都在,只是前端调用的时候,把想清理过滤的已经完成了,若想直接在编辑里把相应的样式或者标签过滤掉,这就需要到相应的编辑器代码中修正,UEditor编辑器里面亲测是可以把相应的字段和样式清理掉的,目前暂时没用到,以后若是用到了再分享给大家。