2012-06-24 3 views
-1

Можно создать дубликат:
Replace a list of emoticons with their imagesRegex preg_replace для смайликов

я занимаюсь разработкой веб-сайт, где я хочу, чтобы дать пользователям возможность поставить улыбки на столбах. Мой (только функциональная) Идея заключается в том, чтобы использовать массив таким образом:

$emoticons = array(
array("17.gif",":)"), 
array("6.jpg",":P"), 
..... 
array("9.jpg",":'("), 
array("5.gif","X)") 
); 

с изображением на [0] и смайлик на [1]. И на каждом $ пост:

foreach($emoticons as $emoticon){ 
    $quoted_emoticon = preg_quote($emoticon[1],"#"); 
    $match = '#(?!<\w)(' . $quoted_emoticon .')(?!\w)#'; 
    $post = preg_replace($match,'<img src="images/emoticons/'.$emoticon[0].'">',$post); 
} 

Это работает хорошо, но моя проблема заключается в том '#(?!<\w)(' и ')(?!\w)#', потому что я хочу смайликов применять только тогда, когда предшествующие символы, «начинаются» (^) или «пустой» и последующие символы «конец» ($) или «пустой». Какое правильное регулярное выражение сделать это?

+0

Вы хотите смайлики должны быть заменены только в начале или в конце вашей строки? –

+0

Нет, везде ... даже в начале или в конце ... точно так же, как любой другой форум ... –

ответ

0

Я думаю, что вы хотите, позитивный взгляд позади и позитивный взгляд вперед.

Пример:

(?<=\s|^)(\:\))(?=\s|$) 

Вашего примера обновление:

foreach($emoticons as $emoticon){ 
    $quoted_emoticon = preg_quote($emoticon[1],"#"); 
    $match = '(?<=\s|^)(' . $quoted_emoticon .')(?=\s|$)'; 
    $post = preg_replace($match,'<img src="images/emoticons/'.$emoticon[0].'">',$post); 
} 
+0

Лучше ... но не идеально, потому что первое появление не работает. В начале, если $ post только :), это не сработает! –

+0

Я изменил таким образом: $ match = '# (? <= \ S | $) ('. $ Quoted_emoticon. ') (? = \ S | $) #'; –

+0

infact: $ match = '# (? <= \ S | ^) ('. $ Quoted_emoticon. ') (? = \ S | $) #'; –

0

Я бы с:

$e = array(':)' => '1.gif', 
      ':(' => '2.gif', 
     ); 

foreach ($e as $sign => $file) { 
    $sign = preg_replace('/(.)/', "\\$1", $sign); 
    $pattern = "/(?<=\s|^)$sign(?=\s|$)/"; 
    $post = preg_replace($pattern, " <img src=\"images/emoticons/$file\">", $post); 
} 
+0

Нет, вы не поняли или я не смог объяснить проблему: Я хочу применить замену ТОЛЬКО когда предыдущий/последующий символ BLANK (или они^| $, это означает начало/конец) Моя структура данных уже работает! У меня нет проблем с заменой ... Я хочу ограничить КОГДА заменить! –

+0

если кто-то пишет: Здравствуйте, меня зовут Ральф ;-) OK. Если некоторые пишут: Здравствуйте, меня зовут Ральф ;-) NO Понимаете? –

+0

@GiuseppeDonato - обновлено –

Смежные вопросы