2012-03-11 18 views
5

अभी मैं इमोटिकॉन के लिए इस समारोह का उपयोग कर रहा:PHP में इमोटिकॉन्स को प्रतिस्थापित करने का एक बेहतर तरीका?

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); 
    } 

लेकिन अगर आप एक लिंक http:// की :/ हिस्सा प्रतिस्थापित हो जाता है में प्रवेश करता है, तो: कोड के साथ

enter image description here

ही (सामने 4 स्थानों कोड बॉक्स बनाने के लिए प्रत्येक पंक्ति का), लेकिन किसी कारण से एक साधारण ) प्रतिस्थापित हो जाता है (एक विंक के साथ):

enter image description here

क्या इस तरह के सभी आइकनों को बदलने से बेहतर समाधान है? यह स्पष्ट रूप से अच्छा काम नहीं करता है। मैंने Google पर बहुत कुछ खोजा है और मुझे कोई बेहतर तरीका नहीं मिला है। मैंने उपरोक्त एसोसिएटिव सरणी में प्रत्येक इमोटिकॉन से पहले एक जगह डालने का भी प्रयास किया लेकिन यह काम नहीं करता है अगर आप इसे दर्ज करते हैं :) इससे पहले कि कुछ भी।

उत्तर

12

आप preg_replace फ़ंक्शन का उपयोग कर सकते हैं और फिर नियमित अभिव्यक्ति में शब्द सीमाओं का उपयोग कर सकते हैं।

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

आप क्योंकि यह करने के लिए प्रारंभ और अंत बिंदु का ख्याल रखना होगा शब्द सीमाओं और नहीं सफेद स्थान का प्रयोग करना होगा। इससे पहले अंतरिक्ष की आवश्यकता है कि सिर्फ एक :) नहीं मिलेगा।

+0

शब्द सीमाओं के लिए +1 - लेकिन 'http: // www' के मामले में 'http' शब्द नहीं होगा, और एक शब्द सीमा होगी, इसलिए ': /' अभी भी फ़िल्टर हो जाएगा? – Tim

+3

असल में, मैं इसे वापस लेता हूं - +1 ['preg_quote'] (http://php.net/preg_quote) के लिए, यह कमाल है! – Tim

+0

तो मैंने इसे 'strtr() 'का उपयोग करने के बजाय अपने फ़ंक्शन में रखा है? ** संपादित करें: ** हम्म, किसी कारण से अब छवियों में कोई आइकन नहीं बदला जा रहा है। मुझे आश्चर्य है कि कोई कोड इमोटिकॉन्स कोड बॉक्स में छवियों में बदलने का कोई तरीका नहीं है? – Nathan

0

मुझे लगता है कि आपके इमोटिकॉन्स को परिभाषित करने के बजाय regular expressions का उपयोग करना। यह देख सकता

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

रेगुलर एक्सप्रेशन की तरह इस के लिए धीमी गति से कर रहे हैं, तो पाठ बड़ा है के रूप में ज्यादा के रूप में मैं उन्हें पसंद है, आप केवल एक आइकन अगर यह रिक्त स्थान से घिरा हुआ है कि जिस तरह से लगाना चाहिए, अपने उपयोगकर्ताओं को दंगा नहीं होगा यूआरएल लिखने की कोशिश करते समय।

1

मुझे यकीन है कि क्या यह या काम नहीं करेगा नहीं हूँ, लेकिन मैं इस तरह कुछ अतिरिक्त रिक्त स्थान रखने का प्रयास करेंगे:

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); 
} 
संबंधित मुद्दे