Phích cắm không biết xấu hổ: Bạn có thể xem tại đây (regular expression replace a word by a link) để lấy cảm hứng
Câu hỏi được yêu cầu thay thế một số từ bằng một liên kết nhất định, trừ khi đã có liên kết. Vì vậy, vấn đề bạn có là nhiều hơn hoặc ít hơn cùng một điều.
Tất cả những gì bạn cần là một regex khớp với URL (thay cho từ). Giả định đơn giản nhất sẽ là như sau: URL (tùy chọn) bắt đầu bằng "http://"
, "ftp://"
hoặc "mailto:"
và kéo dài miễn là không có ký tự trắng, dấu ngắt dòng, dấu ngoặc kép hoặc dấu ngoặc kép).
Hãy coi chừng, regex dài phía trước. Áp dụng phân biệt chữ hoa chữ thường.
(href\s*=\s*['"]?)?((?:http://|ftp://|mailto:)?[^.,<>"'\s\r\n\t]+(?:\.(?![.<>"'\s\r\n])[^.,!<>"'\s\r\n\t]+)+)
Được cảnh báo - điều này cũng sẽ phù hợp với URL là kỹ thuật không hợp lệ, và nó sẽ nhận ra things.formatted.like.this như một URL. Nó phụ thuộc vào dữ liệu của bạn nếu nó quá nhạy cảm. Tôi có thể tinh chỉnh regex nếu bạn có các ví dụ trong đó nó trả về các kết quả dương tính giả.
Regex sẽ tạo hai nhóm đối sánh. Nhóm 2 sẽ chứa nội dung phù hợp, rất có thể là URL. Nhóm 1 sẽ chứa một chuỗi rỗng hoặc 'href="'
. Bạn có thể sử dụng nó làm chỉ báo rằng kết quả trùng khớp này xảy ra bên trong thông số a href của liên kết hiện tại và bạn không phải chạm vào liên kết đó.
Khi bạn xác nhận rằng điều này phù hợp với bạn hầu hết thời gian (với dữ liệu do người dùng cung cấp, bạn không bao giờ có thể chắc chắn), bạn có thể thực hiện phần còn lại theo hai bước. câu hỏi:
- Thực hiện một liên kết xung quanh mỗi URL có (trừ có cái gì đó trong nhóm trận đấu 1!) Đây sẽ sản xuất đôi lồng nhau
<a>
thẻ cho những điều mà có một liên kết rồi.
- Scan for lồng nhau đúng
<a>
thẻ, loại bỏ trong cùng một
Tôi đã thêm một = vào (? ]) khi bắt đầu không ngắt link (thẻ neo không được trích dẫn). Nice regex btw :) – Joel
@ Joel: Bạn có chắc chắn rằng bạn muốn điều đó có nghĩa là "Xác nhận rằng không thể kết hợp dấu chấm, dấu hoa thị, dấu ngoặc kép hoặc dấu ngoặc nhọn trước vị trí hiện tại trong chuỗi"? –