我有一个数据库,有3个表评论,位置和否定词的电影评论im试图检测如果单词' not‘出现在一个积极或消极的词之前,然后加1的位置计数,如果它出现在一个否定的词之前,即这是不坏的,如果它出现在一个位置的词之前,即这是不好
目前我有这个方法,但它似乎只检测前一个单词一次,我怎么才能让它通过整个文本检测
$find = $review_text;
if (preg_match("/(?<=not) $negwords/i", $find))
{
echo $good++;
}
if (preg_match("/(?<=not) $poswords/i", $find))
{
echo $bad++;
}发布于 2012-03-21 18:39:13
假设:
$negwords = array("bad","aweful");如果要检查前面是否有not的负面单词,则需要在查询中使用替代方法:
$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
发布于 2012-03-22 01:32:53
The Guy Of Doom展示了一个聪明的解决方案,可以用一个正则表达式检查整个文本,而不必遍历单词列表并对每个单词执行一次搜索。但是,您问到的问题是PHP中的regexp默认只查找第一个匹配项。正如他提到的,为此您需要preg_match_all()。只需执行以下操作:
preg_match_all("/(?<=not) $poswords/i", $find, $results);$results不需要预先定义。调用该函数后,PHP会将regexp的结果作为数组数组放入变量$results中。第一个数组将包含您想要的内容:每次找到匹配项时匹配的完整字符串(其他数组包含与捕获的组对应的字符串部分,即括号中的表达式部分)。
在某些语言中,您可以使用g运算符来获取所有匹配项(在同一位置放置不区分大小写的运算符i),但在PHP中,您就是这样做的。
https://stackoverflow.com/questions/9802367
复制相似问题