раз
$result_txt = preg_replace("# программ(.+?) #is", " <b>программ\\1</b> ", $txt);
два
$txt = " ".$txt." ";
$txtl = strtolower($txt);
$len = strlen($txtl);
$start = array();
$finish = array();
for($i=0;$i<$len;$i++)
{
if( substr($txtl,$i,9) == " программ" )
{
$start[$i] = $i;
$pos = $i+9;
while( substr($txtl,$pos,1) != " " and $pos <= $len )$pos++;
if($pos < $len)$finish[$i] = $pos;
else unset($start[$i]);
}
}
$result_txt = "";
for($i=0;$i<$len;$i++)
{
if( in_array($i,$start) )$result_txt .= "<b>";
$result_txt .= substr($txt,$i,1);
if( in_array($i,$finish) )$result_txt .= "</b>";
}
$result_txt = substr($result_txt,1,-1);
Эти две функции делают одно и то же: поиск и выделение целого слова по началу.
Первая выглядит элегантней. Но кинь текст мегабайт на 10 с сотнями или тысячами вхождений заданного слова, и ты подвесишь сервер на пару минут; вторая функция отстреляется буквально за секунду.
_____________
Бесплатному сыру в дырки не заглядывают...