Asked Nov 7th, 5:28 AM 162 0 2
  • 162 0 2
0

Cách kiểm tra chuỗi có từ bắt đầu bằng dấu @ trong PHP

Share
  • 162 0 2

Mình muốn kiểm tra chuỗi để xử lý bất kỳ từ nào bắt đầu bằng dấu @.

$string = "Hello, I am @Tom . I'm a cat. This is @Jerry .";  //trường hợp 1
$string = "Hello, this is <a href='https://website.com/user/Tom'>@Tom</a>"; //trường hợp 2
$string = "Hello, my email is [email protected]"; //trường hợp 3

Làm sao để mình chỉ thu được kết quả như ở trường hợp 1, còn trường hợp 2 và 3 thì bỏ qua. preg_match('@', $string) dường như không ổn.

(Mục đích cuối cùng là khi người dùng gõ văn bản có dấu @Nickname thì sẽ chuyển thành đường link dẫn tới tài khoản đã đăng kí.)

Oh! Chữ Nickname ở trên đã chuyển sang dạng link, y như cái mong đợi.

Test email: [email protected]

Dr Dokkan @dokkan7
Nov 7th, 6:40 AM

Mình dùng

$text = preg_replace("/@([A-Za-z0-9\/\.]*)/", "<a target=\"_new\" href=\"http://website.com/user/$1\">@$1</a>", $string);
echo $text;

Nhưng không loại được trường hợp dấu @ nằm ở giữa từ ví dụ như trong email.

+1
| Reply
Share

2 ANSWERS


Answered Nov 9th, 9:38 AM
Accepted
+4

Theo mình hiểu thì bạn muốn match @nickname chỉ khi trước @ không phải là một ký tự nào đó (mà phải là whitespace) đúng không nhỉ 😄

Bạn thử cách này xem sao nhé, mình cũng chỉ sửa lại một chút từ cách làm trong comment của bạn thôi 😃

function replaceMention($string) {
    // Replace nếu string bắt đầu bằng @   
    $string = preg_replace("/^@([A-Za-z0-9\/\.]*)/", "<a target=\"_new\" href=\"http://website.com/user/$1\">@$1</a>", $string);
    // Replace trong các trường hợp @ nằm bên trong văn bản, và phía trước nó phải là ký tự thuộc kiểu whitespace
    $string = preg_replace("/(\s)@([A-Za-z0-9\/\.]*)/", "$1<a target=\"_new\" href=\"http://website.com/user/$2\">@$2</a>", $string);    
    return $string;
}

$string1 = "Hello, I am @Tom. I'm a cat. This is @Jerry.";
$string2 = "Hello, this is <a href='https://website.com/user/Tom>@Tom</a>";
$string3 = "Hello, my email is [email protected]";
$string4 = "@Tom: hello, are you @Jerry?";
echo replaceMention($string1) . "\n";
echo replaceMention($string2) . "\n";
echo replaceMention($string3) . "\n";
echo replaceMention($string4) . "\n";

Output

Hello, I am <a target="_new" href="http://website.com/user/Tom.">@Tom.</a> I'm a cat. This is <a target="_new" href="http://website.com/user/Jerry.">@Jerry.</a>
Hello, this is <a href='https://website.com/user/Tom>@Tom</a>
Hello, my email is [email protected]
<a target="_new" href="http://website.com/user/Tom">@Tom</a>: hello, are you <a target="_new" href="http://website.com/user/Jerry">@Jerry</a>?

Bạn thử lại xem có ổn không 🤔

Share
Dr Dokkan @dokkan7
Nov 11th, 7:50 AM

Chào bạn. Mình đã test và thấy code của bạn chạy ổn.

Lưu ý: bạn nào sau này thấy bài viết này thì cần chú ý là username không nên dính các ký tự đặc biệt như ',",!"/, tốt nhất là ở dạng alphanumeric.

+1
| Reply
Share
com streamvn @streamvn.pay
Tuesday, 2:36 PM

Đúng cái đang cần, cảm ơn bác

0
| Reply
Share
Answered Nov 9th, 8:12 AM
+1

@dokkan7 Bạn có thể research thêm từ khóa regex, + cái muốn tìm ví dụ php regex start with @ chẳng hạn

Coding happy!

Share
Dr Dokkan @dokkan7
Nov 11th, 7:50 AM

Cảm ơn bạn.

0
| Reply
Share
Nov 12th, 12:52 AM

@dokkan7 Bác giải quyết được vấn đề chưa thế

0
| Reply
Share