我的列表如下所示:
$hotWords = ['fedora', 'tips', 'reddit', '/r/', 'god', 'le', 'army', 'iq', 'redditor', 'm\'lady'];
这个想法是这些单词出现在一个字符串中越多,“加权”就越高。
我计划使用一些不区分大小写的正则表达式来匹配这些短语,但是我想为每个单词使用添加一个额外的点,包括每次出现单词时添加一个权重值,即使它被重复。
基本上这个数组中的每个匹配都等于一个额外的点。我怎么去编程?
答案 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