Если вы хотите использовать регулярное выражение:
$pat = '#(^|\W)'.preg_quote($this->laugh,'#').'($|\W)#';
$str = str_replace($pat, $this->t_laugh, $str);
Это в основном означает, что смайлик может находиться в начале строки или продолжаться не несимвольным символом, и за ним должен следовать конец строки или другой несловесный символ. preg_quote
необходимо, если ваш смайлик содержит какие-либо специальные символы регулярного выражения.
Кроме того, лучшим форматом может быть:
$emoticons = array(
'smile' => array('<img src...', array('>:]',':-)',...),
'laugh' => array('<img src....', array(...)),
...
)
Тогда вы можете зациклить все.
Обновление
Вместо совпадений смайликов следует использовать отрицательные обходные пути. Тогда он не будет пытаться сопоставить окружающие пространства.
<?php
$smile = array(">:]", ":-)", ":)", ":o)", ":]", ":3", ":c)", ":>", "=]", "8)", "=)", ":}", ":^)");
$laugh = array(">:D", ":-D", ":D", "8-D", "x-D", "X-D", "=-D", "=D", "=-3", "8-)");
$sad = array(">:[", ":-(", ":(", ":-c", ":c", ":-<", ":-[", ":[", ":{", ">.>", "<.<", ">.<");
$wink = array(">;]", ";-)", ";)", "*-)", "*)", ";-]", ";]", ";D", ";^)");
$tongue = array(">:P", ":-P", ":P", "X-P", "x-p", ":-p", ":p", "=p", ":-Ã", ":Ã", ":-b", ":b", "=p", "=P");
$surprise = array(">:o", ">:O", ":-O", ":O", "°o°", "°O°", ":O", "o_O", "o.O", "8-0");
$annoyed = array(">:\\", ">:/", ":-/", ":-.", ":\\", "=/", "=\\", ":S");
$cry = array(":'(", ";'(");
$ary = array_merge($smile, $laugh, $sad, $wink, $tongue,$surprise,$annoyed,$cry);
foreach ($ary as $a)
{
$quoted[] = preg_quote($a, '#');
}
$regex = implode('|', $quoted);
$full = '#(?!<\w)(' . $regex .')(?!\w)#';
echo $full.PHP_EOL;
$str = "Testing :) emoticons :D :(";
preg_match_all($full, $str, $matches);
print_r($matches[0]);
Кроме того, попробуйте использовать одинарные кавычки при написании шаблонов регулярных выражений, поскольку двойные кавычки допускают escape-последовательности, а одинарные кавычки не будут интерпретировать escape-последовательность. то есть вам иногда нужно удваивать косую черту при использовании двойных кавычек.