我有一个带有3个表评论的数据库,pos和用于电影评论的否定词我试图检测单词'not'是否出现在正面或负面的单词之后然后在pos计数中加上1如果它出现在neg之前这个字也不错,如果它出现在pos字之前,那么在neg数上加1,即这不好
目前我有这个方法,但它似乎只检测到一个单词之前没有,我怎样才能通过整个文本检测它
$find = $review_text;
if (preg_match("/(?<=not) $negwords/i", $find))
{
echo $good++;
}
if (preg_match("/(?<=not) $poswords/i", $find))
{
echo $bad++;
}
答案 0 :(得分:0)
假设:
$negwords = array("bad","aweful");
如果您想检查之前是否有任何否定词,则需要在查询中使用替代词:
$words = '(' + implode('|', $negwords) + ')'; // $words now contains (bad|aweful)
if(preg_match("/(?<=not) $words/i",$find)) {
echo "match found!";
}
请注意$ negwords 不得包含任何正则表达式特殊字符! (如。*?等) - 如果需要,请使用preg_quote
。
要了解有多少匹配,您可以使用preg_match_all
返回匹配数。
答案 1 :(得分:0)
Guy Of Doom显示了一个聪明的解决方案,可以使用单个正则表达式检查整个文本,而不必遍历单词列表并对每个单词进行一次搜索。但是,您问的问题是PHP中的regexp默认只查找第一个匹配项。正如他所提到的那样,你需要preg_match_all()
。就这样做:
preg_match_all("/(?<=not) $poswords/i", $find, $results);
$results
不需要事先定义。调用该函数后,PHP会将regexp的结果作为数组数组放入变量$results
中。第一个数组将包含您想要的内容:每次找到匹配时匹配的完整字符串(其他数组包含与捕获的组对应的字符串部分,即括号中表达式的部分)。
在某些语言中,您可以使用g运算符来获取所有匹配项(在同一位置放置不区分大小写的运算符i),但在PHP中这是您执行此操作的方式。