仕事を適切に行うには、 RegExpをもう少し精巧にする必要があります — 仕事に適した正規表現を取得するには、多くの試行錯誤が必要です。修正などが必要です。
あなたの例を考えると、ソリューションの完全なコードは次のようになります。
var $target = $('.msg_body p');
var text = $target.text();
var replacement = text.replace(/\|URI=([^\|]+)\|([^\|]+)\|EURI\|/g, function(string, url, text){
return '<a href="' + url + '">' + text + '</a>';
});
$target.html(replacement);
1 つのreplace
テキストを見つけて別のテキストに置き換える以上のことを行うため、メソッドには関数が必要です。部分文字列をキャプチャし、事前に定義されたコード間で再構成する必要がある精巧な文字列をキャプチャしています。MDN はreplace
、この記事で関数の使い方をかなりうまく説明しています。
最終的に、トリッキーな部分は正規表現そのものです。
/\|URI=([^\|]+)\|([^\|]+)\|EURI\|/g
g
末尾の は単にグローバル (つまり、文字列内の this のすべてのインスタンスを置き換える) を意味し、開始と終了の/
は正規表現の表記法です。この|
文字は正規表現で特別な意味を持ちます (これは を表し、OR
前後のシーケンスを交換可能であることを意味します)、その前にスラッシュを付けてエスケープする必要があります: \|
. 次に、次のようになります。
\|URI=
: この文字列で始まるシーケンスを見つけます
([^\|]+)
:グループをキャプチャします— —一連のルールに()
一致する文字で構成されます — — これらのルールは、そうでないもの— — 文字(エスケープされた) です。これを 1 回以上行います — . これにより、基本的に次までのすべての文字が取得され、グループに割り当てられます。[]
^
\|
|
+
|
\|
: 次の文字は|
.
([^\|]+)
: 手順 2 と同様に、再度グループとしてキャプチャします。
\|EURI\|
: シーケンスの終わり。
そのため、replace メソッドの関数は常にstring
最初の引数として一致する全体を持ちますが、式内の任意のグループも追加の引数として取り上げます。ステップ 2 のものは our url
、ステップ 4 のものは ourtext
です。次に、関連するコンポーネントを含む HTML リンク構文の単純な連結を返します。
これが完成したものです:http://jsfiddle.net/barney/B3E7N/