2

<and>&lt;andに置き換えたい&gt;のは、html タグの一部でない場合です。入力は、特定の html タグを含む可能性のある文字列になります。小なり記号と大なり記号 (">" "<") を含めることもできます。例えば:

String example1 = "-> <b> Bold </b> <-";
String example2 = "< <i> Italic </i> >"
String example3 = "<i>foo >> </i>"

私が取得したい出力として:

String output1 = "-&gt; <b> Bold </b> &lt;-";
String output2 = "&lt; <i> Italic </i> &gt;";
String output3 = "<i>foo &gt;&gt; </i>";

うまくいかないのでreplaceAll、正規表現の一致を使用する必要があると思います。何か案は?他の方法?

注 1:特定のプロジェクト要件のため、サードパーティ ライブラリはオプションではありません。
注 2: HTML タグのサブセットのみをサポートしています (テキスト スタイリング タグ: 斜体、下線、太字など)。

4

5 に答える 5

2

これは重要なタスクです。HTMLは正規の言語ではない(もしかしたらイレギュラーなのか?)ので、正規表現を使って解析することはできません。次のことをお勧めします。

オプション1

空白を保持する必要がない場合は、これを使用してください。

  1. 入力からすべての空白を削除します。
  2. 「<」と「>」をセパレータとして使用して、入力をトークンに分割します。セパレータを保持します。
  3. 次のように処理します。
    1. トークンがサポートされている HTML タグではなく、"<" が含まれている場合は、必要に応じて "<" を変換してください。
    2. トークンがサポートされている HTML タグではなく、">" が含まれている場合は、必要に応じて ">" を変換します。
    3. HTML タグを変更せずに渡します。

オプション 2

複数文字先読みを使用して各入力行を処理します。

入力の各文字。変換文字は {">"、"<"}

  1. 文字は変換文字です。
  2. いいえの場合、次の文字に進みます。
  3. はいの場合は、これがサポートされている HTML タグであるかどうかを判断するために先を見越してください (これは注意が必要な部分です)。
  4. サポートされている HTML タグの一部でない場合は、文字を変換します。
  5. サポートされている HTML タグの一部である場合は、HTML タグに続く文字に進みます。
于 2013-03-01T17:51:58.323 に答える
1

5つのhtmlタグのみをサポートしている場合は、最初にそれらのタグをテキストから削除できます。<と>を<と>に置き換えてから、htmlタグを再度追加します。removeテキストから<b>を、たとえば[b]に置き換えます。他のタグについても同じようにします。

于 2013-03-02T09:53:00.713 に答える
1

外部ライブラリを使用することに煩わされない場合は、すべての html タグで配列を作成し、文字列に対して実行する必要があります。

そのためのライブラリがあるため、あまりお勧めしません...

于 2013-03-01T17:40:11.407 に答える
0

任意の HTML ファイルを想定すると、テキスト ノードを分離してそれらで実行する必要がありますreplace

既存のライブラリを使用できない場合は、独自のライブラリを作成します。

(JSoup はこれを行うことができますが、これは「外部ライブラリ」です。つまり、Java SE 標準には含まれていませんが、再実装することはオプションです。)

于 2013-03-01T17:44:35.163 に答える
0

文字列に valid が含まれていると仮定しますHTML tags。次のメソッドを適用して文字列を解析し、探している結果を得ることができます。

private static String parse(String str)
{
    StringBuilder sBuilder = new StringBuilder();
    for (int i = 0 ; i < str.length() ; i++)
    {
        char ch = str.charAt(i);
        if (ch == '>' && i != 0)
        {
            char c = str.charAt( i - 1);
            if (Character.isWhitespace(c) || !Character.isLetter(c))
            {
                sBuilder.append("&gt;");
            }
            else
                sBuilder.append(ch);
        }
        else if (ch == '>' && i==0)
        {
            sBuilder.append("&gt;");
        }
        else if (ch == '<' && i < str.length() - 1)
        {
            char c = str.charAt( i + 1);
            if (!(c=='/' || Character.isLetter(c)))
            {
                sBuilder.append("&lt;");
            }
            else
                sBuilder.append(ch);
        }
        else if (ch == '<' && i == str.length() - 1)
        {
            sBuilder.append("&lt;");
        }
        else
        {
            sBuilder.append(ch);
        }
    }
    return sBuilder.toString();
}
于 2013-03-01T19:08:46.610 に答える