java调用js实现富文本过滤

简介: java调用js实现富文本过滤

场景


有个需求,后台文章编辑的是富文本,app显示有问题,但是app处理话标签比较麻烦,web端是可以的,因此,方案1是让app请求一个web页面,web页面获取我们的富文本原始内容,然后通过正则转换,方案2是在后台调用前端已经调试好的正则,直接给app,效果更好。


但是js的正则比较灵活,java的正则写法太过麻烦,不想折腾了,于是,我想到了可以调用java内置的js引擎,直接使用前端给的js正则即可。


具体操作如下:


1.准备js正则,放在springboot工程resource文件夹下:


1dc618a0ed9580ce8bfa6facb208c08f.png

formatH5内容如下:


'use strict';
function getFormatRichText(html) {
   var newContent = undefined;
   newContent = html.replace(/<img[^>]*>/gi, function (match) {
       var resolve = undefined;
       resolve = match.replace(/style="[^"]+"/gi, function (styleMatch) {
           var arr = styleMatch.split('=');
           arr[1] = arr[1].substr(0, arr[1].length - 1) + 'width:100%;"';
           return arr.join('=');
       });
       resolve = match.replace(/width="[^"]+"/gi, '');
       resolve = match.replace(/height="[^"]+"/gi, '');
       return resolve;
   });
   newContent = newContent.replace(/style="[^"]+"/gi, function (match) {
       var resolve = match.replace(/width:[^;]+;/gi, 'max-width:100%;');
        resolve = resolve.replace(/min-max-width:[^;]+;/gi, 'min-width:100%;');
        resolve = resolve.replace(/max-max-width:[^;]+;/gi, 'max-width:100%;');
       return resolve;
   });
   newContent = newContent.replace(/<br[^>]*\/>/gi, '');
   return newContent;
}


2.业务代码


public BusinesArticle appInfo(String articleId) {
        //获取文章内容
        BusinesArticle article = getById(articleId);
        if(StringUtils.isNotBlank(article.getArticleContent())){
            try{
                ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
                //获取文件路径
//                File file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX+ "formatH5.js");
                InputStream inputStream = RegionUtil.class.getResourceAsStream("/formatH5.js");
                InputStreamReader reader = new InputStreamReader(inputStream);
                //执行文件
                engine.eval(reader);
                Invocable invocable = (Invocable) engine;
                //调用js中函数
                String  result = (String) invocable.invokeFunction("getFormatRichText", article.getArticleContent());
                logger.info(result);
                article.setArticleContent(result);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return article;
    }


3.注意问题


1.java8-java15只能解析es5


2.读取文件必须用流方式


相关文章
|
4月前
|
JavaScript 前端开发 Java
java调用js实现富文本过滤
java调用js实现富文本过滤
|
1天前
|
JavaScript 前端开发 Oracle
java和JavaScript的区别
java和JavaScript的区别
6 3
|
1月前
|
JavaScript Java
什么?java中居然可以执行js代码了?真是不知者不怪
什么?java中居然可以执行js代码了?真是不知者不怪
13 1
|
1月前
|
开发框架 前端开发 JavaScript
Java和JavaScript区别与联系
Java和JavaScript区别与联系
33 0
|
1月前
|
前端开发 JavaScript Java
【Java】Java与JavaScript:探究它们的区别与联系
【Java】Java与JavaScript:探究它们的区别与联系
42 0
|
1月前
|
前端开发 JavaScript 安全
浅谈 Java和JavaScript区别与联系
浅谈 Java和JavaScript区别与联系
|
1月前
|
移动开发 前端开发 JavaScript
Java 和 JavaScript 的奇妙协同:语法结构的对比与探索(下)
Java 和 JavaScript 的奇妙协同:语法结构的对比与探索(下)
|
1月前
|
JavaScript 前端开发 Java
Java 和 JavaScript 的奇妙协同:语法结构的对比与探索(中)
Java 和 JavaScript 的奇妙协同:语法结构的对比与探索(中)
|
1月前
|
JavaScript 前端开发 Java
Java 和 JavaScript 的奇妙协同:语法结构的对比与探索(上)
Java 和 JavaScript 的奇妙协同:语法结构的对比与探索(上)
|
2月前
|
JavaScript 前端开发 Java
【热点话题】----还分不清Java和JavaScript嘛【JavaScript猜数字游戏】
【热点话题】----还分不清Java和JavaScript嘛【JavaScript猜数字游戏】
21 1