Вот, решил сравнить скорость работы мей функции и функции SHAKA1:
<?php
$a = 'word wOrd bla blaman, bla bla word word word megaword wordx ywordx <word word="word"> word, word. WORD! ';
function kwm($text) {
return preg_replace_callback('/(?<=>|^)([^<]*)/s', 'kw_bold', $text);
}
function kw_bold($pk) {
$words = array('word', 'bla'); // Array of keywordZ
return preg_replace('!(?<=\W|^)('.join($words, '|').')(?=\W|$)!is', '<b>\1</b>\2', $pk[1]);
}
function kw_strong ($kw, $text) {
$allowsim='("|\?|!|:|\'|\.|\(|\)|;|-|\+|\#|No|\$|%|\^|&|\*|_|/|\\\\| |}|{|\[|\||\])';
$open_tag='<b>';
$close_tag='</b>';
$kwords = trim(preg_replace('/("|\?|!|:|\'|\.|\(|\)|;|\\\\|\[|\||\])+/', '', $kw));
$kwords = array_unique(explode(",", strtolower($kwords)));
$count = count($kwords);
for ($i=0;$i<$count;$i++) {
$kwords[$i]=trim($kwords[$i]);
$text = preg_replace("#".$open_tag."".$close_tag."#","",preg_replace('#(<[^<^>]*?>)|([^<>'.$allowsim.'('.$kwords[$i].')('.$allowsim.')]*)('.$allowsim.'('.$kwords[$i].')'.$allowsim.')#si', '\\1\\2\\4'.$open_tag.'\\5'.$close_tag.'\\6', $text));
}
return $text;
}
$time = microtime(true);
echo htmlspecialchars(kwm($a)).'<br>';
printf('Time: %.5f s', microtime(true)-$time);
echo "<br><hr>";
$time = microtime(true);
echo htmlspecialchars(kw_strong('word, bla', $a)).'<br>';
printf('Time: %.5f s', microtime(true)-$time);
?>
Результат:
<b>word</b> <b>wOrd</b> <b>bla</b> blaman, <b>bla</b> <b>bla</b> <b>word</b> <b>word</b> <b>word</b> megaword wordx ywordx <word word="word"> <b>word</b>, <b>word</b>. <b>WORD</b>!
Time: 0.00018 s
word <b>wOrd</b> <b>bla</b> blaman, <b>bla</b> bla <b>word</b> word <b>word</b> megaword wordx ywordx <word word="word"> word, <b>word</b>. <b>WORD</b>!
Time: 0.00096 s
Как видно, моя функция работает не только быстрее, но и не допускает ошибок, когда два кейворда идут подряд.