Php在正面/负面词之前找到单词

时间:2012-03-21 10:09:32

标签: php words

我有一个带有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++;
}

2 个答案:

答案 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返回匹配数。

http://nl3.php.net/manual/en/function.preg-match-all.php

答案 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中这是您执行此操作的方式。