Возможно излишнее количество (увеличен процессор / нагрузка), но безопасно на 99,99999999%:
<?php
$n = new DOMDocument();
$n->loadHTML('<p>Thats a good example :/ .. with a <a href="http://www.foobar.com">link</a> inside.</p>');
$x = new DOMXPath($n);
$instances = $x->query('//text()[contains(.,\':/\')]');//or use '//*[child::text()]' for all textnodes
foreach($instances as $node){
if($node instanceof DOMText && preg_match_all('/:\//',$node->wholeText,$matches,PREG_OFFSET_CAPTURE|PREG_SET_ORDER)){
foreach($matches[0] as $match){
$newnode = $node->splitText($match[1]);
$newnode->replaceData(0,strlen($match[0]),'');
$img = $n->createElement('img');
$img->setAttribute('src','smily.gif');
$img = $newnode->parentNode->insertBefore($img,$newnode);
//var_dump($match);
}
}
}
var_dump($n->saveHTML());
?>
Но на самом деле вы не хотите делать это все так часто, за исключением одного раза, покажите много, если вы позволяетепользователи редактируют html (beit в wysiwyg или в противном случае, преобразование 'return' (img to text) намного легче. Вы можете расширить с помощью различных смайликов (одно регулярное выражение монстра, чтобы соответствовать им, или несколько меньших / strstr () для читабельности, и массив для смайлика в src (например, массив (': /' => 'frown.gif')) будет подходить.