2011-01-22 30 views
7

Tôi cho rằng đây là một số việc cần làm với regex, nhưng đó là nghệ thuật tất cả đều là của riêng - và tôi cần trợ giúp.Php để thay thế @username bằng liên kết tới tài khoản twitter

Khi chúng tôi hiển thị một câu chuyện, chúng tôi lưu trữ tất cả văn bản trong một biến thể - giả sử $ câu chuyện.

Điều tôi muốn làm là str_replace (tôi nghĩ đó là những gì tôi cần) có nội dung như sau: "Nếu văn bản có chứa @something thì chuyển nó thành liên kết như <a href="http://www.twitter.com/something">@something</a> - nhưng chỉ làm điều này nếu không có gì trước biểu tượng @ "(để loại trừ địa chỉ email)

Ngoài ra, chúng tôi cần phải dừng 'điều gì đó' nếu có dấu cách hoặc dấu câu sau đó. để cái gì đó. không biến thành <a href="http://www.twitter.com/something.">@something.</a>

Bất kỳ đề xuất nào về cách thực hiện công việc này?

Trả lời

13
$input = preg_replace('/(^|\s)@([a-z0-9_]+)/i', 
         '$1<a href="http://www.twitter.com/$2">@$2</a>', 
         $input); 

See it

Nó phù hợp với một @ được trước bởi khoảng trắng hoặc không có gì (khi đó là ngay từ đầu).

Nó cũng có thể được sử dụng quá thiếu lookbehind tích cực như:

$input = preg_replace('/(?<=^|\s)@([a-z0-9_]+)/i', 
         '<a href="http://www.twitter.com/$1">@$1</a>', 
         $input); 

nào phù hợp với chỉ tên twitter nhưng chỉ khi có không gian hoặc không có gì trước đó.

+0

Cảm ơn! Làm việc hoàn hảo. – Andelas

+0

Đối số thứ hai (ví dụ thứ hai) phải là '$1 '. – BudgieInWA

+0

Xin chào, tôi đang học regex và ví dụ này rất hữu ích đối với tôi. Tôi nhận được gần như tất cả các ví dụ đầu tiên, nhưng không hiểu những gì/i ở phần cuối của mô hình đầu tiên có nghĩa là. ai đó quan tâm để giải thích? –

6

Một lookbehind tích cực có thể làm các trick:

preg_replace('/(?<=\s)@(.*?)/', '<a href="....com/$1">@$1</a>') 

đi ra khỏi đỉnh đầu của tôi. "Nếu có một @ đứng trước cái gì đó là khoảng trống, thì hãy lấy bất cứ cái gì sau sau @ và làm thẻ html gói".

+1

Vâng, bạn muốn '[a-z0-9 _-]' thay vì '.' trong regex, phải không? Kể từ khi tên twitter không thể có các ký tự đặc biệt hoặc không gian (mà regex của bạn sẽ nhận ngay bây giờ. Trong thực tế, nó sẽ ăn cho đến cuối chuỗi) ... – ircmaxell

+0

Không có khi có một tên twitter ngay tại bắt đầu mà không có một không gian trước nó. – codaddict

+0

Điều này đang tìm biểu tượng "@" và tạo liên kết - nhưng không sử dụng văn bản theo sau @ trong URL hoặc nội dung được hiển thị. Vì vậy, những gì tôi thấy là '@ ' – Andelas

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