2010-02-26 29 views
6

Tôi nghĩ đây sẽ là một tìm kiếm đơn giản trên google nhưng dường như không phải. Tôi có thể sử dụng regex nào trong C# để phân tích URL bao gồm bất kỳ chuỗi truy vấn nào từ văn bản lớn hơn? Tôi đã dành rất nhiều thời gian và tìm thấy rất nhiều ví dụ về những ví dụ không bao gồm chuỗi truy vấn. Và tôi không thể sử dụng System.URI, bởi vì giả sử bạn đã có URL ... Tôi cần tìm nó trong văn bản xung quanh.regex cho URL bao gồm chuỗi truy vấn

+0

Quy tắc là gì? Họ sẽ được mã hóa đúng cách, hoặc có thể có không gian trong chuỗi? Nếu chúng sẽ được mã hóa đúng cách về bất kỳ mẫu nào bạn đã làm trước đây nếu bạn thêm đơn giản, hãy thêm một tìm kiếm cho các ký tự không khoảng trắng vào cuối ký tự đó. – Guildencrantz

Trả lời

3

này sẽ nhận được chỉ là về bất cứ điều gì (bạn có thể thêm các giao thức bổ sung):

@"(https?|ftp|file)\://[A-Za-z0-9\.\-]+(/[A-Za-z0-9\?\&\=;\+!'\(\)\*\-\._~%]*)*" 

Khó khăn thực sự là việc tìm kiếm kết thúc. Như vậy, mô hình này dựa vào việc tìm kiếm một ký tự không hợp lệ. Đó sẽ là bất kỳ thứ gì ngoài chữ cái, số, gạch nối hoặc dấu chấm trước khi kết thúc tên miền hoặc bất kỳ thứ gì ngoài dấu cộng (/), dấu hỏi (?), Dấu và (&), bằng dấu (=), dấu chấm phẩy (;), dấu cộng (+), dấu chấm than (!), dấu nháy đơn/dấu nháy đơn ('), dấu ngoặc mở/đóng, dấu sao (*), dấu gạch dưới (_), dấu ngã (~) hoặc dấu phần trăm (%)) sau tên miền.

Lưu ý rằng điều này sẽ cho phép các URL không hợp lệ như

http://../ 

Và nó sẽ nhặt những thứ sau một URL, chẳng hạn như trong chuỗi này:

Có lẽ bạn nên thử http://www.google.com.

Trường hợp "http://www.google.com." (với dấu chấm) sẽ được khớp.

Nó cũng sẽ bỏ lỡ URL mà không bắt đầu với một đặc tả giao thức (đặc biệt là các giao thức trong tập đầu tiên của ngoặc Ví dụ, nó sẽ bỏ lỡ URL trong chuỗi này:.

Có lẽ bạn nên cố gắng www.google.com.

nó rất khó khăn để có được mọi trường hợp nếu không có ranh giới tốt hơn xác định.

+0

Không hoạt động ... xem phản hồi ở đây: http://stackoverflow.com/questions/9125016/get-url-from-a-text – kape123

+0

@ kape123: "Không hoạt động" không hữu ích lắm. Tôi chỉ ra chính xác những thiếu sót của nó là gì. Nó hoạt động như mô tả. Có trường hợp nào khác mà bạn muốn làm việc không? –

0

Sử dụng ABNF vào cuối RFC3986 như là một điểm khởi đầu để làm cho nó đúng.

Điều này sử dụng chúng để xác thực URI bằng Python; không phải những gì bạn đang tìm kiếm, nhưng nó nên đưa ra một ý tưởng về hướng bạn nên đi vào: http://gist.github.com/138549

0

Xin lỗi tôi chưa thể thêm nhận xét, nhưng muốn chỉ ra rằng câu trả lời của P Daddy yêu cầu một chút tinh chỉnh:

@"(https?|ftp|file)\://[a-zA-Z0-9\.\-]+(/[a-zA-Z0-9\?\&\=;\+!'\(\)\*\-\._~%]*)*" 
+1

Tôi không thể tìm thấy bất kỳ điều gì khác ngoại trừ việc bạn đã đảo ngược thứ tự các ký tự viết hoa và chữ thường (không có chữ), và khi thực hiện, sửa lỗi đánh máy tôi đã có 'aZ' (chữ thường) a 'to upper-case 'Z'). Lần tới, nó sẽ đơn giản hơn để chỉ ra lỗi đánh máy. Tôi sẽ sửa chữa nó. –

Các vấn đề liên quan