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 が呼び出されることです! 1 レベルだけ深くなっているようなものです。理由を知っている人はいますか?ネストされたタグの「適切な」動作を有効にするために、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

誤解を招く質問で申し訳ありません-問題を見つけましたが、説明に含まれていませんでした-入力文字列は前処理されていたため、次のようなテキストを見ていました

<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 に答える
0

XPでJDK6を使用している私にとってはうまくいくようです。サンプル HTML を head タグと body タグでラップしました。次の 3 行の出力が得られました。

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 に答える