URL を C# 文字列のハイパーリンクに変換する最も簡単な方法は?
質問
Twitter API を使用しており、すべての URL をハイパーリンクに変換したいと考えています。
これを行うためにあなたが思いついた最も効果的な方法は何ですか?
から
string myString = "This is my tweet check it out http://tinyurl.com/blah";
に
This is my tweet check it out <a href="http://tinyurl.com/blah">http://tinyurl.com/>blah</a>
解決
正規表現は、おそらくこの種のタスクの味方です。
Regex r = new Regex(@"(https?://[^\s]+)");
myString = r.Replace(myString, "<a href=\"$1\">$1</a>");
URL を照合するための正規表現には少し作業が必要な場合があります。
他のヒント
私はこれとまったく同じことをしました JSON APIを使用するjquery これがlinkify関数です:
String.prototype.linkify = function() {
return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/, function(m) {
return m.link(m);
});
};
これは実際には厄介な問題です。URL には句読点が含まれる (句読点で終わる) 場合があるため、URL が通常のテキストに埋め込まれている場合、URL が実際にどこで終わるかを判断するのが難しい場合があります。例えば:
http://example.com/.
は有効な URL ですが、文の終わりでも同様に簡単に使用できます。
I buy all my witty T-shirts from http://example.com/.
スペースが見つかるまで単純に解析することはできません。スペースが見つかると、ピリオドが URL の一部として保持されるためです。また、URL ではピリオドが非常に一般的であるため、ピリオドまたはスペースが見つかるまで単純に解析することはできません。
はい、ここでは正規表現が味方ですが、適切な正規表現を構築するのが難しい部分です。
こちらもチェックしてください: .NET で正規表現を使用して URL を展開する.
正規表現を使用して MatchEvaluator デリゲート関数を使用することで、これにさらに制御を追加できます。この文字列があるとします。
find more on http://www.stackoverflow.com
このコードを試してください
private void ModifyString()
{
string input = "find more on http://www.authorcode.com ";
Regex regx = new Regex(@"\b((http|https|ftp|mailto)://)?(www.)+[\w-]+(/[\w- ./?%&=]*)?");
string result = regx.Replace(input, new MatchEvaluator(ReplaceURl));
}
static string ReplaceURl(Match m)
{
string x = m.ToString();
x = "< a href=\"" + x + "\">" + x + "</a>";
return x;
}
/レッドウルブズを応援する
から:this.replace(/[A-Za-z]+://[A-Za-z0-9-]+.[A-Za-z0-9-:%&\?/.=]+/, function(m){...
見る:/[A-Za-z]+://[A-Za-z0-9-]]+.[A-Za-z0-9-:%&\?/.=]+/
アドレス「anyprotocol」://「anysubdomain/domain」.「anydomainextension and address」のコードがあります。
これは、文字列操作の他の用途の完璧な例です。.replace を使用して自由にスライスしたり、必要に応じて適切な「a href」を挿入したりできます。
.link メソッドではカスタマイズできない場合でも、jQuery を使用してコンテンツ読み込みロジックでこれらのリンクの属性を「target=_blank」に簡単に変更しました。
私は個人的に、オンザフライの文字列フィルタリング (String.prototype.linkify 宣言) のために文字列オブジェクトにカスタム メソッドを追加するのが大好きですが、それが大規模な環境でどのように機能するかはわかりません。 10 個以上のカスタム linkify のような関数を整理する必要があります。その時点でコード構造に何か別のことを行う必要があるのは間違いないと思います。
もしかしたら獣医がここに来て、私たちに教えてくれるかもしれません。