1

問題:

レポート、具体的にはレポートのテーブル本体を生成するサーブレットがあります。これはブラック ボックスであり、ソース コードにはアクセスできません。

それにもかかわらず、その動作は満足のいくものであり、サーブレットはすぐに書き直されたり置き換えられたりする予定はありません。

生成された他のレポートへのリンクを更新するために、応答テキストを変更する必要があります。アンカー テキストを見つけて正規表現を使用して置き換えるフィルターを使用することを考えていました。

リサーチ:

正規表現フィルターを持つこの質問に遭遇しました。それは私が必要とするものであるべきですが、そうではないかもしれません。

私は HTML を解析用語の厳密な意味で解析しようとしているわけではなく、言語の完全な仕様を扱っているわけでもありません。私が持っているのは、テーブル本体を構成する HTML タグのサブセットであり、ネストされたテーブルがないため、サーブレットによって生成された HTML サブセットは再帰的ではありません。

アンカー ターゲットを検索/置換し、タグに属性を追加するだけです。

質問は次のとおりです。

この種のすべてのリンクを変更するには、サーブレットの出力を変更する必要があります。

<a href="http://mypage.com/servlets/reports/?a=report&id=MyReport&filters=abcdefg">

次のようなリンクに:

<a href="http://myOtherPage.com/webReports/report.xhtml?id=MyReport&filters=abcdefg" target="_parent">

@ Jeremy Steinによって書かれた正規表現フィルターを使用する必要がありますか、それともより良い解決策がありますか?

4

2 に答える 2

1

変化するターゲット A タグの唯一の部分が href 属性のクエリ コンポーネントであると仮定すると、このテスト済みの正規表現ソリューションはかなりうまく機能するはずです。

// TEST.java 20121024_0800
import java.util.regex.*;
public class TEST {
    public static String fixReportAnchorElements(String text) {
        Pattern re_report_anchor = Pattern.compile(
            "<a href=\"http://mypage\\.com/servlets/reports/\\?a=report&id=([^\"]+)\">",
            Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
        Matcher m = re_report_anchor.matcher(text);
        return m.replaceAll(
            "<a href=\"http://myOtherPage.com/webReports/report.xhtml?id=$1\" target=\"_parent\">"
            );
    }
    public static void main(String[] args) {
        String input =
            "test <a href=\"http://mypage.com/servlets/reports/?a=report&id=MyReport&filters=abcdefg\"> test";
        String output = fixReportAnchorElements(input);
        System.out.println(output);
    }
}
于 2012-10-24T14:57:47.530 に答える
0

Jeremy Stein (クリックして質問に移動)クラスを使用しましたが、いくつかの変更が加えられています。

a) フィルター チェーンまたはサーブレットの誰もがラッパー オブジェクトで getOutputStream() を呼び出さないことを確認してください

b) ページに 1 つの変更を加えたかったので、web.xml に filterConfig を配置しませんでした。

b.2) また、web.xml には何も入れていません。javax.servlet.annotation.WebFilterクラス自体で を使用しました。

c) パターンを設定し、クラスで文字列を直接置き換えます。

Pattern searchPattern = Pattern.compile("<a (.*?) href=\".*?id=(.*?)[&amp;|&]filtros=(.*?)\" (.*?)>(.*?)</a>");
String replaceString = "<a $1 href=\"/webReports/report.xhtml?idRel=$2&filtros=$3\" target=\"_parent\" $4>$5</a>";

.*?必要以上のマッチングを避けるために、可能な限りマッチングを少なくすることに注意してください。

マッチングと正規表現をテストするために、このテーマの調査中に見つけたこのアプレットを使用しました。

これが同じ問題を抱えている人に役立つことを願っています。

于 2012-10-24T16:58:53.633 に答える