2016-11-30 31 views
5

Tôi đã kinda gặp khó khăn một chút ...PHP văn bản để biểu tượng cảm xúc

Tôi nhìn lên khoảng 5 câu hỏi stackoverflow về vấn đề này, nhưng không ai trong số họ dường như làm việc theo cách tôi có trong tâm trí. Về cơ bản tôi chỉ muốn thay thế "từ" bằng biểu tượng cảm xúc.

Vấn đề là tôi muốn từ được chuyển đổi chỉ khi từ đó không phải là một phần của một từ khác.

Đây là mã tôi có cho đến nay:

$text = ":D i dont kn:ow about this :O i just want to :) and :D everyday:P"; 
$icons = array(
     ':)' => '<img class="postemot" src="/emoticons/smile_yell.png" />', 
     ':D' => '<img class="postemot" src="/emoticons/laugh_yell.png" />', 
     ':(' => '<img class="postemot" src="/emoticons/sad_yell.png" />', 
     '>:O' => '<img class="postemot" src="/emoticons/scared_yell.png" />', 
     ':p' => '<img class="postemot" src="/emoticons/tongue_yell.png" />', 
     ':P' => '<img class="postemot" src="/emoticons/tongue_yell.png" />', 
     ':O' => '<img class="postemot" src="/emoticons/surprised_yell.png" />', 
     ':o' => '<img class="postemot" src="/emoticons/surprised_yell.png" />' 
    ); 
    foreach($icons as $icon=>$image) { 
      $icon = preg_quote($icon); 
      $text = preg_replace("~\b$icon\b~",$image,$text); 
    } 
    echo $text; 

Nhưng nó chỉ không làm việc. Đầu ra không chính xác. Trên thực tế, biểu tượng cảm xúc đầu ra duy nhất là biểu tượng cuối cùng, số "hàng ngày: P", không chính xác.

+1

Những thứ bạn cần xem xét ... khi nào biểu tượng cảm xúc là một phần của một từ khác ?? những gì ngăn cách các biểu tượng cảm xúc từ các từ ??? –

+0

@Hallur - Nó không phải là những gì ngăn cách chúng. Đó là những gì làm cho họ chấp nhận được xuất thành biểu tượng cảm xúc. Ví dụ, khi biểu tượng cảm xúc là một mình, không có các chữ cái khác xung quanh nó, hãy tạo ra nó. Tôi không biết bạn thậm chí còn có ý nghĩa gì là trung thực ... –

+0

Biểu tượng $ có thể chứa giá mở và đóng; những cần phải được thoát trong regex. – JosefScript

Trả lời

4

Áp dụng metacharacters ranh giới từ xung quanh biểu tượng cảm xúc là không đúng từ \b phù hợp với vị trí đó không được mong muốn:

everyday:P 
     ^asserts right before here 

Vì vậy, bạn phải làm việc với sự khẳng định khác sử dụng lookarounds để đảm bảo biểu tượng cảm xúc không được bao quanh bởi một phi không gian ký tự:

(?<!\S)$icon(?!\S) 
+0

Chỉ cần lưu ý, điều này cũng có thể được thực hiện mà không cần regex: '$ text = str_replace (" $ icon "," $ image ", "$ text"); ' –

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