计算字符串中使用的列表单词数

时间:2015-04-12 18:11:27

标签: php regex laravel-5

我的列表如下所示:

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

这个想法是这些单词出现在一个字符串中越多,“加权”就越高。

我计划使用一些不区分大小写的正则表达式来匹配这些短语,但是我想为每个单词使用添加一个额外的点,包括每次出现单词时添加一个权重值,即使它被重复。

基本上这个数组中的每个匹配都等于一个额外的点。我怎么去编程?

3 个答案:

答案 0 :(得分:1)

$hotWords = ['fedora', 'tips', 'reddit', '/r/', 'god', 'le', 'army', 'iq', 'redditor', 'm\'lady'];
$points = substr_count(
    preg_replace('#('.implode('|',$hotWords).')#','**~'~**',$string)
,'**~'~**');
也许..可以做得更好,也许你有额外的逃避一些字符的正则表达式

答案 1 :(得分: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替换为您自己的字符集。< / p>

答案 2 :(得分:1)

您可以将字符串转换为单词数组,并在数组上运行array_intersect以获取匹配的单词。这适用于/r/和其他正则表达不友好的单词&#34;同样。

// 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