2015-04-12 2 views
0

У меня есть список, который выглядит как этот ниже:подсчитывать, сколько слов из списка используются в строке

$hotWords = ['fedora', 'tips', 'reddit', '/r/', 'god', 'le', 'army', 'iq', 'redditor', 'm\'lady']; 

Идея заключается в том, что чем больше эти слова появляются в строке, тем выше " взвешивание "становится.

Я планировал использовать какое-то нечувствительное к регистру регулярное выражение, чтобы соответствовать этим фразам, однако я хочу добавить дополнительную точку для каждого использования слова, которая включает добавление значения веса каждый раз, когда слово появляется, даже если оно повторяется.

По существу, каждое совпадение в этом массиве равно одной дополнительной точке. Как я могу это программировать?

+0

возможно использовать preg_replace() с некоторыми уникальными и чем substr_count(), что уникальный –

ответ

1

Вы можете использовать регулярные выражения, как: /\b(word1|word2|word3|word4)\b/is в preg_match_all вызова, чтобы получить общее количество вхождений:

$hotWords = ['fedora', 'tips', 'reddit', '/r/', 'god', 'le', 'army', 'iq', 'redditor', 'm\'lady']; 
$re = '/\b(' . implode('|', array_map(function($word) { return preg_quote($word, '/'); }, $hotWords)) . ')\b/is'; 
$string = 'fedora foo bar tips fedora fedoras'; 
//   ^1    ^2 ^3 
echo preg_match_all($re, $string); // 3 

Заметим, однако, это не будет соответствовать «слова», начиная или заканчивая разделители слов, как /r/, так что вы можете заменить \b «S с собственным набором символов.

1
$hotWords = ['fedora', 'tips', 'reddit', '/r/', 'god', 'le', 'army', 'iq', 'redditor', 'm\'lady']; 
$points = substr_count(
    preg_replace('#('.implode('|',$hotWords).')#','**~'~**',$string) 
,'**~'~**'); 

возможно .. может сделать лучше, может быть, вы слишком дополнительную избежать некоторых символов для регулярных выражений

+0

и иметь в виду, что, например, «tip» и «tipper» не работают здесь, только уникальные поисковые запросы –

1

Вы можете превратить строку в массив слов и запустить array_intersect на массивы, чтобы получить соответствующие слова. Это будет работать для /r/ и других регулярных выражений-недружественных слов.

// Define hot words and string 
$hotWords = ['fedora', 'tips', 'reddit', '/r/', 'god', 
      'le', 'army', 'iq', 'redditor', 'm\'lady']; 
$str = 'foo reddit tips bar reddit /r/i/p/ /r/ baz'; 

// Turn string into array and get intersection (matches) 
$words = preg_split('/\s+/', $str); // \s+ allows for multiple spaces 
$matches = array_intersect($words, $hotWords); 

// Echo count 
echo count($matches), PHP_EOL; // reddit + tips + reddit + /r/ => 4 

Выход:

4 
+0

Это не соответствует тем, что называется 'fedoras' при использовании hotword' fedora'. – ComputerLocus

+0

Для этого вам придется либо добавить эти варианты в массив '$ hotWords', либо использовать более сложный алгоритм сопоставления. Возможно, вам захочется взглянуть на [levenshtein] (http://php.net/manual/en/function.levenshtein.php), [аналогичный_текст] (http://php.net/manual/en/function.similar -text.php) и [metaphone] (http://php.net/manual/en/function.metaphone.php). – mhall

Смежные вопросы