2015-04-12 96 views
0

我有一個看起來像下面這樣一個列表:計數列表中有多少個字,字符串中使用

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

的想法是,以上的這些詞出現在一個字符串,越高「加權「成爲。

我打算使用一些不區分大小寫的正則表達式來匹配這些短語,但是我希望爲每個單詞使用都添加一個額外的點,其中包括每次出現單詞時都會添加一個權重值,即使重複該單詞也是如此。

本質上只是在這個數組中的每一個匹配等於一個額外的點。我怎麼去編程呢?

+0

也許使用的preg_replace()有一些獨特的,比substr_count()是唯一 –

回答

1

你可以像使用正則表達式的一些字符:在preg_match_all呼叫/\b(word1|word2|word3|word4)\b/is,得到OCCURENCES總數:

$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的。

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

雖然使用hotword fedora時這不會與'fedoras'類似。 – ComputerLocus

+0

爲此,您必須將這些變體添加到'$ hotWords'數組或使用更復雜的匹配算法。你可能想看看[levenshtein](http://php.net/manual/en/function.levenshtein.php),[similar_text](http://php.net/manual/en/function.similar -text.php)和[metaphone](http://php.net/manual/en/function.metaphone.php)。 – mhall

相關問題