Yii2-WangEditorWidget上传以后数据库字段格式化

该代码段展示了在Yii2框架中如何在插入数据库前处理WangEditor生成的富文本内容,包括过滤无用标签(如script、style等),替换图片为相对路径,以及在显示详情时转换回绝对路径。同时,处理外部图片链接并移除无效的img标签。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * 格式化正文中的图片路径,入库时替换为相对路径,获取详情时替换为绝对路径
 */
public function formatContent($content, $type = 'insert')
{
    $imgUrlPrefix = rtrim(Yii::$app->params['cdn_url_prefix'], '/');
    $urlData = parse_url($imgUrlPrefix);
    $host = $urlData['host'];
    $scheme = $urlData['scheme'];

    //过滤正文无用内容
    if($type == 'insert'){
        //过滤js脚本
        $pattern = "/<script[\s\S]*?<\/script>/i";
        $content = preg_replace($pattern, '', $content);
        //过滤样式
        $pattern = "/<style[\s\S]*?<\/style>/i";
        $content = preg_replace($pattern, '', $content);
        //除img标签外过滤掉标签的所有属性
        $pattern ="/<((?!img)[a-z][a-z0-9]*)[^>]*?(\/?)>/i";
        $content = preg_replace($pattern,'<$1$2>', $content);

        //过滤word中font标签
        $pattern = "/<font[\s\S]*?>([\s\S]*?)<\/font>/i";
        $content = preg_replace($pattern, '$1', $content);
        //将单个font标签替换为空
        $pattern = "/<\/font>|<font[\s\S]*?>/";
        $content = preg_replace($pattern, '', $content);

        //过滤word中xml数据
        $pattern = "/<!--\[if gte mso 9\]>[\s\S]*?<!\[endif\]-->/";
        $content = preg_replace($pattern, '', $content);

        //将单个div标签替换
        $pattern = "/<\/div>|<div[\s\S]*?>/";
        $content = preg_replace($pattern, '', $content);

        //替换空p标签
        $pattern = "/<p><br><\/p>|<p><\/p>/";
        $content = preg_replace($pattern, '', $content);

        //将没有任何标签的文本,用p标签包含
        $pattern = "/<\/p>((?!<p>)[\s\S]+?)<p>/";
        $content = preg_replace($pattern, "</p><p>$1</p><p>", $content);

        //将没有任何标签的文本,用p标签包含
        $pattern = "/<\/p>((?!<p>)[\s\S]+?)$/";
        $content = preg_replace($pattern, "</p><p>$1</p><p>", $content);

        //过滤掉其他无用标签
        $content = strip_tags($content, '<p><img><br>');
    }


    //处理图片,如果是外部图片,替换为空
    $pattern =  '/<img .*?src=[\"|\'](.*?)[\"|\'].*?\/?>/i';
    if(preg_match_all($pattern, strip_tags($content,'<img>'), $matches) > 0)
    {
        if($type == 'insert'){
            foreach($matches[1] as $key=>$value){
                $urlInfo = parse_url($value);
                if($urlInfo['scheme']."://".$urlInfo['host'] == $scheme.'://'.$host){
                    $replace = str_replace($imgUrlPrefix, '', $matches[0][$key]);
                    $content = str_replace($matches[0][$key], $replace, $content);
                }else{
                    $content = str_replace($matches[0][$key], '', $content);
                }
            }
           
            $content = preg_replace('/title\s*=\s*[\"|\'].*?[\"|\']/', '', $content);
        }elseif($type == 'detail'){
            foreach($matches[1] as $value){
                if(substr($value, 0 , 1) !== '/'){
                    $replace = $imgUrlPrefix.'/'.$value;
                }else{
                    $replace = $imgUrlPrefix.$value;
                }

                $content = str_replace($value, $replace, $content);
            }
        }
    }

    //如果图片没有src属性则过滤掉此img
    $img_preg = "/<img(?![^<>]*?src[^<>]*?>).*?>/i";
    preg_match_all($img_preg,$content,$match);
    if (isset($match[0]) && count($match[0]))
    {
        foreach ($match[0] as $item) {
            $content=str_replace( $item,'',$content);
        }
    }
    return $content;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值