2008-08-28 61 views
14

Tôi đang sử dụng API Twitter và muốn chuyển đổi tất cả các URL thành siêu liên kết.Cách dễ nhất để chuyển đổi URL thành siêu liên kết trong chuỗi C#?

Cách hiệu quả nhất mà bạn đã đưa ra để thực hiện việc này là gì?

từ

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> 
+0

Đối với ứng dụng này, bạn nên tìm một giải pháp khớp chính xác với cách thức Twitter tự phân tích các URL - một biểu thức chính quy có thể hoạt động; chỉ cần đảm bảo sử dụng cùng một điều kiện cho phù hợp với kết thúc của URL (so với những thứ như dấu chấm và dấu ngoặc đơn bên phải) như Twitter. –

Trả lời

21

Regular expressions có lẽ bạn của bạn cho các loại hình công việc:

Regex r = new Regex(@"(https?://[^\s]+)"); 
myString = r.Replace(myString, "<a href=\"$1\">$1</a>"); 

Các biểu hiện thường xuyên cho phù hợp với URL có thể cần một chút công việc.

+2

Tôi nghĩ rằng đó là tốt, biểu thức chính quy là mạnh mẽ, nhưng chụp trong khi không khoảng trắng là tốt hơn rất nhiều so với cố gắng để thực hiện một phân tích cú pháp URL trong regex. Tôi có thể thay đổi nó thành '(https?: // [^] +)' bởi vì https không phải là không phổ biến. –

5

Đây thực sự là một vấn đề xấu. URL có thể chứa dấu chấm (và kết thúc bằng), do đó khó có thể xác định nơi URL thực sự kết thúc, khi URL được nhúng trong văn bản thông thường. Ví dụ:

http://example.com/. 

là URL hợp lệ, nhưng nó có thể chỉ là một cách dễ dàng là sự kết thúc của một câu:

I buy all my witty T-shirts from http://example.com/. 

Bạn không thể chỉ đơn giản là phân tích cho đến một không gian được tìm thấy, bởi vì khi đó bạn sẽ giữ khoảng thời gian như một phần của URL. Bạn cũng không thể phân tích cú pháp đơn giản cho đến khi một khoảng thời gian hoặc một khoảng trắng được tìm thấy, bởi vì các khoảng thời gian là cực kỳ phổ biến trong các URL.

Có, regex là bạn của bạn ở đây, nhưng việc xây dựng regex thích hợp là phần khó khăn.

Kiểm tra điều này: Expanding URLs with Regex in .NET.

+0

Đó là hoàn hảo .. :) – TimLeung

+0

Tôi đã mua mỏ của tôi từ http://tempuri.org/. –

7

tôi đã làm điều tương tự chính xác này với jquery consuming the JSON API đây là chức năng 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); 
    }); 
}; 
1

/cổ vũ cho RedWolves

từ: this.replace (/ [A-Za-z] + : // [A-Za-z0-9- ] +. [A-Za-z0-9-:% & \? /.=] + /, hàm (m) {...

xem:/[A-Za-z] +: // [A-Za-z0-9- ] +. [A-Za-z0-9-:% & \ /.=] +/

Có mã cho các địa chỉ "anyprotocol":?. // "anysubdomain/miền" "anydomainextension và địa chỉ",

và đó là một hoàn hảo ví dụ cho các ứng dụng khác của thao tác chuỗi. bạn có thể cắt và xúc xắc theo ý muốn với .replace và chèn "a href" thích hợp nếu cần.

Tôi đã sử dụng jQuery để thay đổi các thuộc tính của các liên kết này thành "target = _blank" dễ dàng trong logic tải nội dung của tôi mặc dù phương thức .link không cho phép bạn tùy chỉnh chúng.

Cá nhân tôi thích sử dụng phương pháp tùy chỉnh cho đối tượng chuỗi để lọc chuỗi bay (String.prototype).linkify declaration), nhưng tôi không chắc nó sẽ phát ra như thế nào trong một môi trường có quy mô lớn, nơi bạn sẽ phải tổ chức hơn 10 chức năng tùy chỉnh giống như liên kết. Tôi nghĩ bạn chắc chắn sẽ phải làm điều gì đó khác với cấu trúc mã của bạn tại thời điểm đó.

Có thể một bác sĩ thú y sẽ vấp ngã ở đây và soi sáng chúng tôi.

1

Bạn có thể thêm một số kiểm soát nhiều hơn về vấn đề này bằng cách sử dụng chức năng đại biểu MatchEvaluator với biểu thức chính quy: giả sử tôi có chuỗi này:

find more on http://www.stackoverflow.com

tại thử mã này

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; 
} 
Các vấn đề liên quan