2010-03-22 23 views
9

Tôi đang cố gắng tìm mọi phiên bản của @username trong văn bản nhận xét và thay thế bằng một liên kết. Đây là PHP của tôi cho đến thời điểm này:Regex để đối sánh không gian trắng hoặc kết thúc chuỗi

$comment = preg_replace('/@(.+?)\s/', '<a href="https://stackoverflow.com/users/${1}/">@${1}</a> ', $comment); 

Vấn đề duy nhất là regex phụ thuộc vào khoảng trắng sau tham chiếu @username. Bất cứ ai có thể giúp tôi tinh chỉnh này vì vậy nó cũng sẽ phù hợp nếu nó là ở phần cuối của chuỗi?

Trả lời

8

thử /@(\w+)/ thay vì /@(.+?)\s/.

+0

Tuyệt vời - đã hoạt động hoàn hảo! Bạn có thể cho tôi biết thêm về \ w không? –

+1

@Kirk: \ w chỉ khớp với bất kỳ ký tự 'từ' nào: A-Za-z0-9_ – animuson

13

Để phát hiện khoảng trắng hoặc kết thúc của chuỗi, bạn sẽ sử dụng: /@(.+?)(?=\s|$)/, nhưng trừ khi tên người dùng của bạn có chứa các ký tự không tự chữ và số, đó là đơn giản để sử dụng \w cho nhân vật từ hoặc \b cho nghỉ từ, tức là .: /@(.+?)\b/ hoặc /@(\w)+/.

+0

Hoặc chúng ta có thể sử dụng nó để xác định có thêm khoảng trắng ở cuối liên kết không? '$ comment = preg_replace ('/ @ (. +?) (?: \ s | $) /', '@${1} $ {2}', $ bình luận);' – animuson

+0

Có, nhưng trong trường hợp đó bạn sẽ phải sử dụng nhóm chụp (loại bỏ '?:'). –

+0

Điều này thực sự thực sự hữu ích! Cảm ơn bạn đã sửa chữa không gian màu trắng –

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