@NoMeRus
SEO как работа и увлечение

Как исправить регулярное выражение в PHP скрипте?

Помогите исправить код скрипта который из текста выбирает наиболее часто встречающиеся слова. Суть проблемы заключается в том, что идет замена стоп слов в тексте на пустоту, тем самым убираем ненужные слова. Но если стоп слово является частью слова (раз -> развития), то на выходе выводится слово "вития", т.к. вырезается якобы стоп слово "раз". Как указать, что если после стоп слова идет буква, то замену делать не нужно?

$content = 'Пылев отметил, что курение является одним из самых известных факторов развития онкологии. Он подтвердил, что отказ от этой вредной привычки может способствовать уменьшению угрозы. Если человек откажется от этой вредной привычки, отдаст предпочтение правильному питанию и активному образу жизни, то риск развития онкологического заболевания будет минимальным.';	
	
class Counter
{
    var $origin_arr;
    var $modif_arr;
    var $min_word_length = 6;
 
function explode_str_on_words($text)
{
    $text = strtolower($text);
    $search = array ("'ё'",
                     "'<script[^>]*?>.*?</script>'si",  // Вырезается javascript
                     "'<[/!]*?[^<>]*?>'si",           // Вырезаются html-тэги
                     "'([rn])[s]+'",                 // Вырезается пустое пространство
                     "'&(quot|#34);'i",                 // Замещаются html-элементы
                     "'&(amp|#38);'i",
                     "'&(lt|#60);'i",
                     "'&(gt|#62);'i",
                     "'&(nbsp|#160);'i",
                     "'&(iexcl|#161);'i",
                     "'&(cent|#162);'i",
                     "'&(pound|#163);'i",
                     "'&(copy|#169);'i",
                     "'&#(d+);'e");
    $replace = array ("е",
                      " ",
                      " ",
                      "1 ",
                      " ",
                      " ",
                      " ",
                      " ",
                      chr(161),
                      chr(162),
                      chr(163),
                      chr(169),
                      "chr(1)");
    $text = preg_replace ($search, $replace, $text);
    //Список стоп символом и слов
    $del_symbols = array(",", ".", ";", ":", "#", "$", "%", "^",
                         "!", "@", "`", "~", "*", "-", "=", "+", "",
                         "|", "/", ">", "<", "(", ")", "&", "?", "?", "t",
                         "r", "n", "{","}","[","]", "'", "“", "”", "•",
                         "как", "для", "что", "или", "это", "этих", "будет", "того", "Для",
                         "всех", "вас", "они", "оно", "еще", "когда", "под", "над", "были", "вместо",
                         "где", "эта", "лишь", "уже", "вам", "нет", "могут",
                         "если", "надо", "все", "так", "его", "чем",
                         "при", "даже", "мне", "есть", "раз", "два",
                         "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
                         );
 
    $text = str_replace($del_symbols, array(" "), $text);
    $text = ereg_replace("( +)", " ", $text);
    $this->origin_arr = explode(" ", trim($text));
    return $this->origin_arr;
}
 
function count_words()
{
    $tmp_arr = array();
    foreach ($this->origin_arr as $val)
    {
        if (strlen($val)>=$this->min_word_length)
        {
            $val = strtolower($val);
            if (array_key_exists($val, $tmp_arr))
            {
                $tmp_arr[$val]++;
            }
            else
            {
                $tmp_arr[$val] = 1;
            }
        }
    }
    arsort ($tmp_arr);
    $this->modif_arr = $tmp_arr;
}
 
function get_keywords($text)
{
    $this->explode_str_on_words($text);
    $this->count_words();
    $arr = array_slice($this->modif_arr, 0, 5);
    $str = "";
    foreach ($arr as $key=>$val)
    {
       $str .= $key . ", ";
    }
    return trim(substr($str, 0, strlen($str)-2));
}
}
 
 
$word_counter = new Counter();
if (strlen($content)>50000)
{
    $keywords = $word_counter->get_keywords(substr($content, 0, 50000));
}
else
{
    $keywords = $word_counter->get_keywords($content);
}
echo $keywords;
  • Вопрос задан
  • 80 просмотров
Пригласить эксперта
Ответы на вопрос 1
xEpozZ
@xEpozZ
Веб-разработчик
Используйте не str_replace, а preg_replace, как у вас в коде это используется выше.
#(remove|me)[^\w]#
удалить remove, me
не удалит removed, meet
слова накидал наобум, вместо них должны быть все ваши
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы