我需要转换一些具有嵌套标签的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 -->
答案 0 :(得分: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);
}
}
}
答案 1 :(得分:0)
对于这个误导性的问题感到抱歉 - 我发现了我的问题,并且它没有包含在我的描述中 - 我的输入字符串已经过预处理,因此我查看了文本,例如
<span>example with <a href="#"> nested >/a< >p<more nesting>/p<
</span> <!-- well of course it all gets thrown together -->