ネストされたタグを持つ 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 が呼び出されることです! 1 レベルだけ深くなっているようなものです。理由を知っている人はいますか?ネストされたタグの「適切な」動作を有効にするために、HTMLParser (あまり使用していない) に対して行う必要がある簡単なことはありますか?
PS - 私は自分でそれを理解しました - 以下の答えを見てください。簡単な答えは、事前にエスケープされた HTML ではなく、HTML を渡せば問題なく動作するということです。どっ!これが他の誰かに役立つことを願っています。
<span>example with <a href="#">nested</a> <p>more nesting</p>
</span> <!-- all this gets thrown together -->