2009-07-28 9 views
1

文字列を取り、その周囲にハイパーリンクをラップする正規表現置換を行う必要がありますすでにハイパーリンクで囲まれています。どうすればいい?ハイパーリンクにテキストをラップする方法まだハイパーリンクにラップされていない場合のみ

ので、例えば、のテキストを見てみましょう:

 
The quick brown fox. 

私はこのような "クイック・ブラウン" のリンク、したい:

 
The <a href="http://www.stackoverflow.com/">quick brown</a> fox. 

しかし、私はテキストを見つけた場合:

 
The <a href="http://www.stackoverflow.com/">quick brown</a> fox. 

別のハイパーリンクで「クイックブラウン」をラップしないようにしたいと思います。

どうすればよいですか?

答えて

0

レンダリングされたhtmlを解析しているかのように見えますが、そうでなければ生のhtmlを解析しないのはなぜですか?その後、問題は簡単になります

+0

私が表示されていないURLが「生の」HTMLで見つからない場合はキーワードのみの交換を行うことが容易になることがありどのように些細になる。私は生のHTMLとレンダリングされたHTMLの違いを理解していません。 htmlは形式です。ブラウザはそのフォーマットをインタフェースにレンダリングします。 正規表現を使用しているドキュメントは、htmlドキュメントです。したがって、htmlを削除する方法はありません。 –

1

どこかにあなたを救うことができます。まったく完璧ではありませんが、ここであなたのテキストがアンカータグですでにラップされているかどうかを確認する簡単な正規表現チェックがあります。

(?<=>)quick brown(?=</a>) 

注:lookbehindアサーションは固定長(少なくともPCRE)である必要があります。

1

リンクを囲む文字列がYOUR_STRINGの場合、YOUR_STRINGがリンクタグで囲まれているすべての場所を最初に識別します。

正規表現= >が含まれていない長さゼロ以上のシーケンスが続く<a

<a[^>]*>[^<]*(YOUR_STRING)[^<]*</a>

開始します。 <が含まれていない長さゼロ以上のシーケンスが続く>

続く

続きを読むYOUR_STRINGこれはキャプチャグループです。

<を含まない0以上の長さのシーケンスが続きます。

は今、あなたが撮影しグループYOUR_STRINGはリンクタグに囲まれた場所の文字オフセットを識別することができます</a>

が続きます。

これらの場所以外では、YOUR_STRINGが実際に発生する他のすべての場所で、リンクタグを囲みます。

ボーナスポイント:あなたは、文字列にテキストを挿入するとき、あなたは文字オフセットを変更したり、あなたの正規表現はConcurrentModificationExceptionがあなたが分析時間の間にテキストを挿入することはできませ/(あなたが何であるかのライブラリに依存を投げることがありますを使用して)。これを処理する最善の方法は、別のStringBufferを作成し、元の文字列を分析する際にそれにテキストを追加することです。

注:ハイパーリンクタグを識別する正規表現は、(正しいhtmlのために)より賢く書くことができますが、これは悪いhtmlでも有効です。例えば。 <a>quick brown fox</a>などのhref属性がありません。あなたが期待しているhtmlが不完全であり、それらの問題を処理したい場合は、それに応じて正規表現を修正する必要があります。

希望します。

1

代わりにキーワードを見て、単にURLに簡単な試合を行うと、

+0

は、リンクがいつ存在するかを識別する第2の問題を解決するが、リンクを必要とするがまだそれを持っていない単語は識別しない。 – davids

関連する問題