2012-03-11 11 views
5

:PHP'deki ifadeleri değiştirmek için daha iyi bir yol var mı? Şu anda ifadeler için bu işlevi kullanıyorum

function emoticons($text) { 
     $icons = array(
       ':)' => '<img src="/images/blank.gif" alt="smile" class="icon_smile" />', 
       ':-)' => '<img src="/images/blank.gif" alt="smile" class="icon_smile" />', 
       ':D' => '<img src="/images/blank.gif" alt="smile" class="icon_laugh" />', 
       ':d' => '<img src="/images/blank.gif" alt="laugh" class="icon_laugh" />', 
       ';)' => '<img src="/images/blank.gif" alt="wink" class="icon_wink" />', 
       ':P' => '<img src="/images/blank.gif" alt="tounge" class="icon_tounge" />', 
       ':-P' => '<img src="/images/blank.gif" alt="tounge" class="icon_tounge" />', 
       ':-p' => '<img src="/images/blank.gif" alt="tounge" class="icon_tounge" />', 
       ':p' => '<img src="/images/blank.gif" alt="tounge" class="icon_tounge" />', 
       ':(' => '<img src="/images/blank.gif" alt="sad face" class="icon_sad" />', 
       ':o' => '<img src="/images/blank.gif" alt="shock" class="icon_shock" />', 
       ':O' => '<img src="/images/blank.gif" alt="shock" class="icon_shock" />', 
       ':0' => '<img src="/images/blank.gif" alt="shock" class="icon_shack" />', 
       ':|' => '<img src="/images/blank.gif" alt="straight face" class="icon_straight" />', 
       ':-|' => '<img src="/images/blank.gif" alt="straight face" class="icon_straight" />', 
       ':/' => '<img src="/images/blank.gif" alt="straight face" class="icon_straight" />', 
       ':-/' => '<img src="/images/blank.gif" alt="straight face" class="icon_straight" />' 
     ); 
     return strtr($text, $icons); 
    } 

Ama http:// ait :/ parçası yerini alır bir bağlantı girerseniz: önünde 4 alanlarda (koduyla

enter image description here

aynı yanı) her satırın) kodu kutusu oluşturmak için, ama nedense basit ) göz kırparak (yerini alır:

enter image description here

Bunun gibi tüm simgeleri değiştirmekten daha iyi bir çözüm var mı? Açıkçası iyi çalışmıyor. Google'da çok fazla arama yaptım ve daha iyi bir yol bulamadım. Yukarıdaki ilişkisel dizinin her bir ifadesinden önce bir boşluk koymayı denedim, ancak daha önce herhangi bir şey olmadan bir :) girdiğinizde işe yaramadı.

cevap

12

preg_replace işlevini kullanabilir ve normal ifadede sözcük sınırlarını kullanabilirsiniz. Bu başlangıç ​​ve bitiş noktalarının ilgilenir çünkü

foreach($icons as $icon=>$image) { 
     $icon = preg_quote($icon); 
     $text = preg_replace("~\b$icon\b~",$image,$text); 
} 

Sözcük sınırları değil, beyaz boşluk kullanmak gerekir. Daha önce bir alana ihtiyaç duymanız, sadece bir :) bulunmayacağı anlamına gelir.

+0

+1 kelime sınırları için - ama 'http: // www' söz konusu olduğunda, 'http' kelimesi ve '/' bir kelime sınırı olmaz, yani ': /' hala filtrelenirdi? – Tim

+3

aslında bunu geri alıyorum - [preg_quote' için] +1 (http://php.net/preg_quote), bu harika! – Tim

+0

Yani bu işlevi strtr() 'yerine kullanmak yerine koydum. ** Düzenleme: ** Hmm, nedense hiçbir simge görüntülere dönüştürülmez. Metin ifadelerinin kod kutularında görüntülere dönüşmemesi için bir yol olup olmadığını merak ediyorum. – Nathan

0

Sadece ifadelerinizi tanımlamak yerine regular expressions'u kullanmayı düşünüyorum. o boşluklarla çevrili eğer metin büyükse Bu,

// replaces a :) when it is surrounded by whitespaces 
return preg_replace('/\s:)\s/', '<img ...>', $text); 
1

Düzenli ifadeler bunun için yavaş gibi ben onları istedikleri kadar görünebilir, sadece, bu şekilde bir simge eklemek gerekir kullanıcıların isyan olmaz URL'leri yazmaya çalışırken.

1

Ben o iş verip vermeyeceğinizi emin değilim, ama böyle bazı ekstra boşluk koymak için çalışacaktı:

Emojify:

function emoticons($text) { 
    $icons = array(
      ' :) ' => ' <img src="/images/blank.gif" alt="smile" class="icon_smile" /> ', 
      ' :-) ' => ' <img src="/images/blank.gif" alt="smile" class="icon_smile" /> ', 
      ' :D ' => ' <img src="/images/blank.gif" alt="smile" class="icon_laugh" /> ', 
      ' :d ' => ' <img src="/images/blank.gif" alt="laugh" class="icon_laugh" /> ', 
      ' ;) ' => ' <img src="/images/blank.gif" alt="wink" class="icon_wink" /> ', 
      ' :P ' => ' <img src="/images/blank.gif" alt="tounge" class="icon_tounge" /> ', 
      ' :-P ' => ' <img src="/images/blank.gif" alt="tounge" class="icon_tounge" /> ', 
      ' :-p ' => ' <img src="/images/blank.gif" alt="tounge" class="icon_tounge" /> ', 
      ' :p ' => ' <img src="/images/blank.gif" alt="tounge" class="icon_tounge" /> ', 
      ' :(' => ' <img src="/images/blank.gif" alt="sad face" class="icon_sad" /> ', 
      ' :o ' => ' <img src="/images/blank.gif" alt="shock" class="icon_shock" /> ', 
      ' :O ' => ' <img src="/images/blank.gif" alt="shock" class="icon_shock" /> ', 
      ' :0 ' => ' <img src="/images/blank.gif" alt="shock" class="icon_shack" /> ', 
      ' :| ' => ' <img src="/images/blank.gif" alt="straight face" class="icon_straight" /> ', 
      ' :-| ' => ' <img src="/images/blank.gif" alt="straight face" class="icon_straight" /> ', 
      ' :/ ' => ' <img src="/images/blank.gif" alt="straight face" class="icon_straight" /> ', 
      ' :-/ ' => ' <img src="/images/blank.gif" alt="straight face" class="icon_straight" /> ' 
    ); 
    return strtr($text, $icons); 
} 
İlgili konular