我需要转换一些具有嵌套标签的 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 -->