1

我需要转换一些具有嵌套标签的 HTML 文本,以使用 css 属性装饰“匹配”以突出显示它(如 firefox 搜索)。我不能只做一个简单的替换(例如,想想如果用户搜索“img”),所以我试图只在正文中进行替换(而不是在标签属性上)。

我有一个非常简单的 HTML 解析器,我认为应该这样做:

final Pattern pat = Pattern.compile(srch, Pattern.CASE_INSENSITIVE);
Matcher m = pat.matcher(output);
if (m.find()) {
    final StringBuffer ret = new StringBuffer(output.length()+100);
    lastPos=0;
    try {
        new ParserDelegator().parse(new StringReader(output.toString()),
        new HTMLEditorKit.ParserCallback () {
            public void handleText(char[] data, int pos) {
                ret.append(output.subSequence(lastPos, pos));
                Matcher m = pat.matcher(new String(data));
                ret.append(m.replaceAll("<span class=\"search\">$0</span>"));
                lastPos=pos+data.length;
            }
        }, false);
        ret.append(output.subSequence(lastPos, output.length()));
        return ret;
    } catch (Exception e) {
 return output;
    }
}
return output;

我的问题是,当我调试它时,handleText 会被包含标签的文本调用!就像它只深入一层。有谁知道为什么?我需要对 HTMLParser 做一些简单的事情(没有使用太多)来启用嵌套标签的“正确”行为吗?

PS - 我自己想通了 - 请参阅下面的答案。简短的回答是,如果您将其传递给 HTML,而不是预先转义的 HTML,它就可以正常工作。嗬!希望这对其他人有帮助。

<span>example with <a href="#">nested</a> <p>more nesting</p>
</span> <!-- all this gets thrown together -->
4

2 回答 2

0

在 XP 上使用 JDK6 对我来说似乎工作正常。我用 head 和 body 标记包装了您的示例 HTML。我得到了三行输出:

a) 示例 b) 嵌套 c) 更多嵌套

这是我使用的代码:

import java.io.*;
import java.net.*;
import javax.swing.text.html.parser.*;
import javax.swing.text.html.*;

public class ParserCallbackText extends HTMLEditorKit.ParserCallback
{
    public void handleText(char[] data, int pos)
    {
        System.out.println( data );
    }

    public static void main(String[] args)
        throws Exception
    {
        Reader reader = getReader(args[0]);
        ParserCallbackText parser = new ParserCallbackText();
        new ParserDelegator().parse(reader, parser, true);
    }

    static Reader getReader(String uri)
        throws IOException
    {
        // Retrieve from Internet.
        if (uri.startsWith("http:"))
        {
            URLConnection conn = new URL(uri).openConnection();
            return new InputStreamReader(conn.getInputStream());
        }
        // Retrieve from file.
        else
        {
            return new FileReader(uri);
        }
    }
}
于 2009-10-19T16:40:47.070 回答
0

很抱歉这个误导性问题 - 我发现了我的问题,但它没有包含在我的描述中 - 我的输入字符串已经过预处理,所以我正在查看诸如

<span>example with &lt;a href="#"&gt; nested &gt;/a&lt; &gt;p&lt;more nesting&gt;/p&lt;
</span> <!-- well of course it all gets thrown together -->
于 2009-10-19T19:21:09.963 回答