0

PerlCGIアプリケーションは検索機能を提供しています。アプリケーションは、一致するスニペットをHTMLページに書き込みます。次に、スニペット内の一致を強調表示します。私は次のようなものを使うことができます

s/($searchregex)/<span class="highlight">$1<\/span>/gi

一致を強調表示します。これはテキストのみの場合には問題なく機能しますが、リンクや参照付きの画像など、HTMLタグ自体を含むスニペットで機能しない場合があります。失敗した場合、上記の置換は、href値内にspanタグを挿入することによってHTMLリンクを破棄します。

現在、私は3つの可能な解決策を見ています。

  1. <>内など、htmlタグ内の一致を置き換えない正規表現を記述します。この場合の代替正規表現の書き方がわかりません。この置換を可能にするperl正規表現はありますか?それはどのように見えますか?

  2. 上記の置換のすべての間違った置換を置き換える正規表現を記述します。これにより、href内の間違ったスパンタグが修正されます。

  3. Javascriptを使用して、結果のDOMツリー内の一致を強調表示します。jQueryを使用する可能性のある方法は、一致するテキストを含むハイライトhtmlに概説されています。通常のJavascriptでさえ、 JavaScriptの正規表現フレーバーで十分かもしれません。ハイライト正規表現を強調表示するための特別なjQueryプラグインもあります。私はJavascriptを初めて使用するので、もう少しアドバイスをいただければ幸いです。

望ましい解決策は何ですか?最善の方法は1です。-しかし、それは不可能のようです。したがって、残りの質問は次のとおりです。サーバー側で醜い方法で作業を行うか、クライアント側でよりクリーンな方法で問題を解決するためにJavascriptを導入します。

4

2 に答える 2

1

サーバー側でHTMLパーサーを使用できます。これは、実行しているジョブに適したツールです。

または、あなたが言うようにjavascriptを使用してそれを行うこともできます。これは、より用途が広く、より多くの対話性につながる可能性があるため、私は自分自身を好みます。クライアント側へ)。

実際には、最初に表示されるよりも複雑な質問です。より多くの情報がなければ、より良い解決策を考え出すことは不可能です。

良い解決策の1つは、DOMツリーをトラバースして各テキストノードと照合することですが、複数のテキストノードにまたがるテキストと照合できないという問題があります。たとえば、「JohntheConJohnson」は「JohntheConJohnson」の検索と一致しません。別々のノードにあるので、ジョン・ザ・コン」。ユースケースに応じて、これは問題になる場合と問題にならない場合があります。

于 2012-08-07T13:39:38.007 に答える
1

パターン後の先読みでperlで

s/($searchregex)(?=[^>]*<)/<span class="highlight">$1<\/span>/gi

以下

s/$searchregex(?=[^>]*<)/<span class="highlight">$&<\/span>/gi

ただし、ファイル全体を文字列で読み取るか、入力レコード区切り文字($ /)を「<」に変更する必要がある場合があります。これは、正規表現の後に「>」と「」以外の文字のシーケンスが続く場合、パターンと一致するためです。 <'は、($ / = "\ n"であり、パターンと次の'<'の間に改行がある場合は一致しないためです。

于 2012-08-07T14:45:31.257 に答える