2017-11-30 22 views
0

私は絵文字システムを実行しようとしています。配列の要素がページを通過する場合は、反対側の値を回してください。例:要素の配列を持つPHP preg_replace

$emoticons = array(
     ':)' => '<img src="assets/smiles/smilesblank.png" alt="smile" class="img-responsive" />', 
     ':-)' => '<img src="assets/smiles/smilesblank.png" alt="smile" class="icon_smile" />', 
     ':D' => '<img src="assets/smiles/smilesblank.png" alt="smile" class="icon_laugh" />', 
     ':d' => '<img src="assets/smiles/smilesblank.png" alt="laugh" class="icon_laugh" />', 
     ';)' => '<img src="assets/smiles/smilesblank.png" alt="wink" class="icon_wink" />', 
     ':P' => '<img src="assets/smiles/smilesblank.png" alt="tounge" class="icon_tounge" />', 
     ':-P' => '<img src="assets/smiles/smilesblank.png" alt="tounge" class="icon_tounge" />', 
     ':-p' => '<img src="assets/smiles/smilesblank.png" alt="tounge" class="icon_tounge" />', 
     ':p' => '<img src="assets/smiles/smilesblank.png" alt="tounge" class="icon_tounge" />', 
     ':(' => '<img src="assets/smiles/smilesblank.png" alt="sad face" class="icon_sad" />', 
     ':o' => '<img src="assets/smiles/smilesblank.png" alt="shock" class="icon_shock" />', 
     ':O' => '<img src="assets/smiles/smilesblank.png" alt="shock" class="icon_shock" />', 
     ':0' => '<img src="assets/smiles/smilesblank.png" alt="shock" class="icon_shack" />', 
     ':|' => '<img src="assets/smiles/smilesblank.png" alt="straight face" class="icon_straight" />', 
     ':-|' => '<img src="assets/smiles/smilesblank.png" alt="straight face" class="icon_straight" />', 
     ':/' => '<img src="assets/smiles/smilesblank.png" alt="straight face" class="icon_straight" />', 
     ':-/' => '<img src="assets/smiles/smilesblank.png" alt="straight face" class="icon_straight" />' 
); 
foreach($emoticons as $icon => $image) { 
     $icon = preg_quote($icon); 
     $text = preg_replace("~\b$icon\b~",$image,$text); 
} 
+0

ある"Some :| emoticon :O"文字列のため、PHP demoを参照してください。 ''〜(?<!\ w)$ icon(?!\ w)〜 ''。またはあなたの顔文字に一致させたい文脈に応じて ''〜(?<!\ S)$ icon(?<!\ S)〜 ''を入力してください。 –

+0

笑。とにかく、あなたは 'strtr'ルートも試すことができました – Ghost

+0

ありがとうございましたが、変更されませんでした。あなたが手紙を書いた場合:smile

答えて

0

あなたはそれはあなたとほぼ同じpatterns->交換用の関数の配列を使用していますpreg_replace_callback_array

を使用することができます。

私はあなたのために少し例を作りました:

<?php 

// initial array 
$emoticons = [ 
    ':)' => '<img src="assets/smiles/smilesblank.png" alt="smile" class="img-responsive" />', 
    ':-)' => '<img src="assets/smiles/smilesblank.png" alt="smile" class="icon_smile" />', 
    ':D' => '<img src="assets/smiles/smilesblank.png" alt="smile" class="icon_laugh" />', 
    ':d' => '<img src="assets/smiles/smilesblank.png" alt="laugh" class="icon_laugh" />', 
    ';)' => '<img src="assets/smiles/smilesblank.png" alt="wink" class="icon_wink" />', 
    ':P' => '<img src="assets/smiles/smilesblank.png" alt="tounge" class="icon_tounge" />', 
    ':-P' => '<img src="assets/smiles/smilesblank.png" alt="tounge" class="icon_tounge" />', 
    ':-p' => '<img src="assets/smiles/smilesblank.png" alt="tounge" class="icon_tounge" />', 
    ':p' => '<img src="assets/smiles/smilesblank.png" alt="tounge" class="icon_tounge" />', 
    ':(' => '<img src="assets/smiles/smilesblank.png" alt="sad face" class="icon_sad" />', 
    ':o' => '<img src="assets/smiles/smilesblank.png" alt="shock" class="icon_shock" />', 
    ':O' => '<img src="assets/smiles/smilesblank.png" alt="shock" class="icon_shock" />', 
    ':0' => '<img src="assets/smiles/smilesblank.png" alt="shock" class="icon_shack" />', 
    ':|' => '<img src="assets/smiles/smilesblank.png" alt="straight face" class="icon_straight" />', 
    ':-|' => '<img src="assets/smiles/smilesblank.png" alt="straight face" class="icon_straight" />', 
    ':/' => '<img src="assets/smiles/smilesblank.png" alt="straight face" class="icon_straight" />', 
    ':-/' => '<img src="assets/smiles/smilesblank.png" alt="straight face" class="icon_straight" />' 
]; 

// prepare callbacks 
$callbacks = []; 
foreach ($emoticons as $smileCode => $replacement) { 
    // regular expression, nothing smart, just plain replacement 
    $regex = '~' . preg_quote($smileCode, '~') . '~'; 
    $callbacks[ $regex ] = function() use ($replacement) { 
     return $replacement; 
    }; 
} 

$text = "Hello :), this is cool :P smile and :-| another one"; 

echo "<pre>\n"; 
echo preg_replace_callback_array($callbacks, $text); 
+0

貴重なコメントをいただきありがとうございます、このページはnull値を返しました(私はそれを見つけたと思います)が、それがどのように使用されているか正確に教えてくれますか? –

+0

確かに、自分の答えを更新しました –

1

ほとんどの場合、あなたは、彼らは通常、いくつかの他のテキストに接着されているとして、顔文字の照合時に単語の境界をチェックする必要はありません。したがって、\bはむしろ冗長であり、削除することができます。具体的なコンテキストのみをターゲットにしたい場合は、最初に\b(?<!\w)に置き換えるか(絵文字の前に単語の文字を置くことはできません)、もう1文字を(?!\w)(単語の後にcharを付けない)に置き換えるか、空白の境界を使用して(?<!\S)それぞれ(?!\S)である。

あなたは、(:-||:-|等重複絵文字が存在する場合に)大きい順に長さの配列のキーをソートpreg_quoteキーをINGのながら交替基づく正規表現パターンを構築し、交換するpreg_replace_callbackを使用することができますそれに対応する値を持つ各キー:

array_multisort(array_map('strlen', array_keys($emoticons)), SORT_DESC, $emoticons);  // IN DESCENDING ORDER 
$pattern = '~' . implode("|", array_map(function($x) {return preg_quote($x, '~');}, array_keys($emoticons))) . '~'; 
echo preg_replace_callback($pattern, function($m) use ($emoticons) { 
     return $emoticons[$m[0]]; 
    }, "Some :| emoticon :O"); 

は、結果はあなたが `\ B`ここでは、使用を使用することはできません

Some <img src="assets/smiles/smilesblank.png" alt="straight face" class="icon_straight" /> emoticon <img src="assets/smiles/smilesblank.png" alt="shock" class="icon_shock" /> 
+0

問題は本当ですが、ページ上で見つけたときに変更する必要があるようなものがあります –

+0

@OsmanCakmak今すぐ警告があります:マッチしたくない場合':D 'を':Dot'に追加すると、パターンの最後に '(?!\ w)'を追加する必要があります。または '(?!\ S)'。私が元の投稿の下で私のコメントで述べたのと同じように。 '\ b'では、単語でない文字の後に単語charが必要で、その逆もあります。適切なコンテキストを定義してください。 –

+0

@OsmanCakmak *ページ上で見つけたときに変更する必要があるものは何ですか? '' Some:| emoticon:O "'を '$ text'に置き換えてください。 –

関連する問題