Я бы не стал делать это с регулярным выражением.
Я бы использовал карту, где ключи - это символы смайлика, а значения - это URL-адреса смайликов.Затем я перебрал бы записи карты и заменил бы все найденные ключи эквивалентными значениями.
К сожалению, вы не говорите, что это за язык программирования, поэтому вот простая реализация Java:
Map<String,String> smileyMap = new HashMap<String, String>();
smileyMap.put(":-)", "simpleSmiley.png");
smileyMap.put(":-(", "sadSmiley.png");
// etc.
String text = null;// wherever you get the text from
for(Entry<String, String> entry : smileyMap.entrySet()){
text=text.replace(entry.getKey(),
"<img src=\"http://my.smiley.server/"+ entry.getValue() + "\" />");
}
// now text contains the smileys as HTML images