2013-12-02 5 views
0

Я работаю над функцией замены bb-кода, когда пользователь хочет отправить смайлик.php preg_match_all preg_replace array issue

Проблема заключается в том, что если кто-то использует смайлик bb-кода, который не существует, это приводит к пустой записи, поскольку браузер не отображает (несуществующий) смайлик.

Вот мой код до сих пор:

// DO [:smiley:] 
    $convert_smiley = preg_match_all('/\[:(.*?):\]/i', $string, $matches); 

    if($convert_smiley) 
    {   
    $string = preg_replace('/\[:(.*?):\]/i', "<i class='icon-smiley-$1'></i>", $string, $convert_smiley); 
    } 

    return $string; 

ББ-код смайлик обычно выглядит [:smile:] или как [:sad:] или как [:happy:] и так далее.

Код выше работает хорошо, пока кто-то не разместит bb-код, который не существует, поэтому то, о чем я прошу, является исправлением для не существующих смайликов.

Есть ли возможность, например, создать массив, например array('smile', 'sad', 'happy'), и будет преобразован только bb-код, который соответствует одному или нескольким в этом массиве?

Итак, после исправления, размещение [:test:] или просто [::] не должно быть преобразовано и должно быть опубликовано в качестве исходного текста, в то время как [:happy:] будет преобразовано.

Любые идеи? Благодаря!

ответ

1

Я положил свои возможные Смайли в не группируя скобках с or символом в регулярном выражении:

<?php 
$string = 'looks like [:smile:] or like [:sad:] or like [:happy:] [:bad-smiley:]'; 
$string = preg_replace('/\[:((?:smile)|(?:sad)|(?:happy)):\]/i', "<i class='icon-smiley-$1'></i>", $string); 

print $string; 

Выход:

looks like <i class='icon-smiley-smile'></i> or like <i class='icon-smiley-sad'></i> or like <i class='icon-smiley-happy'></i> [:bad-smiley:] 

[: обливание смайлик:] игнорируется.

1

Простое решение:

$string ="[:clap:]"; 

$convert_smiley = preg_match_all('/\[:(.*?):\]/i', $string, $matches); 

$emoticons = array("smile","clap","sad"); //array of supported smileys 

if(in_array($matches[1][0],$emoticons)){ 
    //smily exists 
    $string = preg_replace('/\[:(.*?):\]/i', "<i class='icon-smiley-$1'></i>", $string, $convert_smiley); 
} 
else{ 
    //smily doesn't exist 
} 
+0

Это самое простое обходное решение, а также самое близкое решение для моего вопроса и кода, так что даже другие ответы правильны, ваш ответ будет отмечен как правильный. Спасибо – lickmycode

+0

Извините, вам нужно отменить его, ваше решение провалится, когда один смайлик неверен, но все остальные, тогда смайлик не преобразуется. : / – lickmycode

1

Ну, первый вопрос вы устанавливаете $convert_smiley к значению preg_match_all()true/false вместо разбора результатов. Вот как я переработал код:

// Test strings. 
$string = ' [:happy:] [:frown:] [:smile:] [:foobar:]'; 

// Set a list of valid smileys. 
$valid_smileys = array('smile', 'sad', 'happy'); 

// Do a `preg_match_all` against the smiley’s 
preg_match_all('/\[:(.*?):\]/i', $string, $matches); 

// Check if there are matches. 
if (count($matches) > 0) { 
    // Loop through the results 
    foreach ($matches[1] as $smiley_value) { 
    // Validate them against the valid smiley list. 
    $pattern = $replacement = ''; 
    if (in_array($smiley_value, $valid_smileys)) { 
     $pattern = sprintf('/\[:%s:\]/i', $smiley_value); 
     $replacement = sprintf("<i class='icon-smiley-%s'></i>", $smiley_value); 
     $string = preg_replace($pattern, $replacement, $string); 
    } 
    } 
} 

echo 'Test Output:'; 
echo htmlentities($string); 

Просто обратите внимание, что я решил использовать sprintf() для форматирования содержимого & установить $pattern и $replacement как переменные. Я также решил использовать htmlentities(), поэтому элементы HTML DOM можно легко прочитать для отладки.