2017-11-30 3 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을 참조하십시오 ' "~ (?

+0

당신은 담당 ** 수 있습니다 **? 롤. 어쨌든, 당신은'strtr' 경로도 시도 할 수 있습니다 – Ghost

+0

고마워요,하지만 바뀌지 않았습니다. 쓴 경우 : smile

답변

0

당신은 preg_replace_callback_array

그것은 patterns-의 배열> 당신과 거의 동일 대체 기능을 사용 할 수 있습니다.

나는 당신을 위해 약간의 예를했습니다 :

<?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은 다소 중복되어 제거 할 수 있습니다. 당신이 정말로 특정 컨텍스트를 대상으로하려는 경우, 당신은 (?<!\S)(?!\w)와 두 번째 (후 어떤 단어 문자) (이모티콘이 단어 문자가 앞에 할 수없는 경우) (?<!\w) 가진 첫번째 \b 교체를 고려, 또는 공백 경계를 사용할 수있다 및 각각 (?!\S).

넌 (:-||:-| 같은 중첩 이모티콘있다 경우) 내림차순 길이만큼 배열의 키들을 정렬 preg_quote가 키를 보내고있는 동안 교대 기초 정규식 패턴을 구축하고 대체 할 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

업데이트되었습니다 문제는 사실이지만, 당신이주의해야 할 점은 바로 지금이 참고 @OsmanCakmak 페이지 –

+0

에서 찾을 때 변경해야 할 뭔가가있다 : 당신이 일치하지 않는 경우는 ': D'를': Dot'에 넣으면, 패턴의 끝에'(?! \ w)'를 추가해야합니다. 또는'(?! \ S)'. 원래 게시물 아래에 내 의견에 언급했던 것처럼. '\ b'을 사용하면 단어가 아닌 char 뒤에 단어 char이 필요하고 그 반대도 마찬가지입니다. 올바른 컨텍스트를 정의하십시오. 당신이 * 의미가 페이지에서 찾을 때 변경해야 할 뭔가가 * 무엇을 –

+0

@OsmanCakmak? ''Some : | emoticon : O "'를'$ text'로 대체하십시오. –