Невозможно изменить текст на изображение, используйте preg_replace

Я пытаюсь преобразовать тексты в строку в смайлики. Я пытался и преуспел на полпути.

Проблема: Когда я заменяю символы в строке смайликами, такие символы, как ":/" в ссылке http://mywebsite.com также заменяется.

Что я сделал до сих пор:

чат.php

<?php 
require('common.php');
if($_POST && !empty($_POST['title'])){
    $result = $db->add_news($_POST['title']);
}
$text="";
function parseSmiley($text){
    //Smiley to image
    $smileys=array('o:)'=>'angel.gif', ':3'=>'colonthree.gif', 'o.O'=>'confused.gif', ":'("=>'cry.gif', '3:)'=>'devil.gif', ':('=>'frown.gif', ':O'=>'gasp.gif', '8)'=>'glasses.gif', ':D'=>'grin.gif', ">:-("=>'grumpy.gif', '<3'=>'heart.gif', '^_^'=>'kiki.gif', ':*'=>'kiss.gif', ':v'=>'pacman.gif', ':)'=>'smile.gif', '-_-'=>'squint.gif', '8|'=>'sunglasses.gif', ':p'=>'tongue.gif', ':/'=>'unsure.gif', '>:-O'=>'upset.gif', ';)'=>'wink.gif');

    //Now you need to find and replace
    foreach($smileys as $smiley=>$img){
        $text=str_replace(htmlspecialchars($smiley), "<img src='emotions-fb/{$img}'/>", $text);
    }
    //Now only return it
    return $text;
}
?>

db.php

function get_news(){
    if($result = $this->db->query('SELECT * FROM news WHERE id<>1 ORDER BY add_date DESC LIMIT 50')){
        $return = '';
        while($r = $result->fetch_object()){
            $timing=explode(" ", $r->add_date);

            $return .= '<p>'.wordwrap(htmlspecialchars($r->title), 25, "\n", true).'</p>';
            //$return .='<p>'.$timing[1].' on '.$timing[0].'</p>';
            $return .= '<hr/>';
        }
        return $return;
    }
}

После этого я искал в stackoverflow и получил что-то вроде этого, но это не заменяет текст на изображение.

    foreach($smileys as $smiley=>$img){
        $smiley=preg_quote($smiley);
        $text=preg_replace("~\b$smiley\b~", "<img src='emotions-fb/{$img}'/>", $text);

    }

Я не знаю, где я ошибаюсь. Заранее спасибо.


person Ayan    schedule 26.10.2014    source источник


Ответы (1)


Пытаться:

$smileys=array('o:)'=>'angel.gif', ':3'=>'colonthree.gif', 'o.O'=>'confused.gif', ":'("=>'cry.gif', '3:)'=>'devil.gif', ':('=>'frown.gif', ':O'=>'gasp.gif', '8)'=>'glasses.gif', ':D'=>'grin.gif', ">:-("=>'grumpy.gif', '<3'=>'heart.gif', '^_^'=>'kiki.gif', ':*'=>'kiss.gif', ':v'=>'pacman.gif', ':)'=>'smile.gif', '-_-'=>'squint.gif', '8|'=>'sunglasses.gif', ':p'=>'tongue.gif', ':/'=>'unsure.gif', '>:-O'=>'upset.gif', ';)'=>'wink.gif');
$text='Some example text with smile :/ ^_^ and :\'( and link <a href="http://google.com"> my site :/</a>';
foreach ($smileys as $smiley => $img)
{
    $smiley = preg_quote( $smiley );
    $text = preg_replace( "#(?<=\s|^)(?:$smiley)(?=\s|$)?#i", '<img src="emotions-fb/'. $img .'">', $text);
}
echo $text;
person trzyeM-    schedule 26.10.2014
comment
Нет. Не работает. Выдает предупреждение, компиляция не удалась: несопоставленная скобка по смещению 9 - person Ayan; 27.10.2014
comment
Я протестировал только один смайл: :/ и он работает. Отредактируйте мой ответ для всех смайлов. Какая у вас версия пхп? Проверьте это: ideone.com/aNr7Ut - person trzyeM-; 27.10.2014
comment
Я попытался загрузить файл, который вы дали, но он все равно выдает мне предупреждение: ничего не повторять по смещению... В строке 8 я использую php 5.3.13 - person Ayan; 27.10.2014
comment
Я использую 5.3.28 на обеих машинах с яичками, и это работает. Попробуйте $smiley = preg_quote( $smiley, '/' ); - person trzyeM-; 27.10.2014
comment
Попробуйте: $text = preg_replace( "#(?<=\s|^)(?:$smiley)((?=\s|$))?#i", '<img src="emotions-fb/'. $img .'">', $text); - person trzyeM-; 28.10.2014
comment
я должен использовать это без части preg_quote? - person Ayan; 28.10.2014
comment
хорошо, теперь это работает, но с определенным текстом, но ничего не показывает, когда я возвращаю значения из db.php в chat.php - person Ayan; 28.10.2014
comment
где я должен разместить это? - person Ayan; 28.10.2014
comment
Если с определенным текстом все в порядке, значит, что-то не так с текстом из базы данных, верно? - person trzyeM-; 28.10.2014
comment
ммм... но я получаю правильные значения, возвращаемые из базы данных. Я делаю что-то неправильно при передаче значений?? см. мой код выше. - person Ayan; 28.10.2014