提问者:小点点

Groovy(或Java):如何仅在超文本标记语言内部文本中转义双引号,而不是在属性中转义双引号


我在WCM系统中使用基于Groovy的超文本标记语言渲染引擎。
我现在有一个用例,用户在基于TinyMCE的表单中输入富文本内容,如下所示:

<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
    <span style="text-decoration: underline;"
        sed diam nonumy
    </span> eirmod "tempor" invidunt ut labore et...
</p>

在我的Groovy渲染器中,我现在想将这个超文本标记语言片段输入到超文本标记语言文档的内容中,以进行客户端JavaScript处理。

我需要做的是:
在内容中转义双引号(参见上面的“temor”标记),但不是那些封装超文本标记语言属性值的值(参见上面的“文本装饰”属性)。

如果我这样做

myHTML.replace("\"", "&quot;")

事实上,我会逃避每一个双引号。

任何建议如何我只能逃避真正的文本中的报价?


共1个答案

匿名用户

把我的评论转换成这个答案。

您可以通过这种方式使用JSoup(jsoup.org)来实现这一点。(在您的示例超文本标记语言中,为了测试,我又添加了两个带引号的地方。)

import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Node;
import org.jsoup.nodes.TextNode;

public class JSoupEscQuotes{
    public static void main( String[] args ){
        String html = "<p>Lorem ipsum \"dolor\" sit amet, consetetur sadipscing elitr,\r\n"
                + "    <span style=\"text-decoration: underline;\">\r\n"
                + "        sed \"diam\" nonumy\r\n"
                + "    </span> eirmod \"tempor\" invidunt ut labore et...\r\n"
                + "</p>";
        
        Document document = Jsoup.parse( html );
        
        StringBuilder sb = new StringBuilder();
        String s = replace( document );
        System.out.println( document );
    }

    private static String replace( Node node ){
        List<Node> cs = node.childNodes();
        if( cs == null || cs.size() == 0 ) return null;
        
        for( Node c : cs ) {
            if( c instanceof TextNode ) {
                TextNode t = (TextNode) c;
                TextNode tReplaced = new TextNode( t.text().replaceAll( "\"", "&quot;" ) );
                t.replaceWith( tReplaced );
            }
            else replace( c );
        }
        
        return null;
    }
}

如果您使用的是Gradle,请像这样包含JSoup。或者,如果您使用的是Maven,您可以使用等效的Maven配置。

implementation 'org.jsoup:jsoup:1.14.3'