我正确使用strpos吗?

时间:2013-06-01 17:30:44

标签: php string

我正在尝试确定一个单词是否存在于一个文本字符串中,然后如果该单词存在,则打印相关的字符串。我遇到了问题,因为这段代码似乎对我的一些用户起作用,但不是全部用户。

$active = $db->query("SELECT * FROM activity ORDER BY aTIME DESC LIMIT 15");

while($activity = $db->fetch_row($active))
{
    $haveact = $activity['activity'];
    $username = $r['username'];
    if(strpos($haveact, $username))
    {
        print " <div class='activitydiv'>   
                {$activity['activity']} &nbsp&nbsp&nbsp&nbsp<small><font color='grey'>
                {$activity['aTIME']}</font></small>
                </div>";
    }
}

7 个答案:

答案 0 :(得分:2)

除了在其他答案中建议的内容之外,我会重新编写整个代码以在查询中执行字符串搜索。例如:

<?php

$active = $db->query("SELECT * FROM (SELECT * FROM activity 
                      ORDER BY aTIME DESC LIMIT 15)
                      WHERE activity LIKE \"%" . $db->escape($r['username']) . "%\";");

while($activity=$db->fetch_row($active))
{
    print "<div class='activitydiv'>
               {$activity['activity']} &nbsp&nbsp&nbsp&nbsp<small><font color='grey'>
               {$activity['aTIME']}</font></small>
           </div>";
}

?>

答案 1 :(得分:1)

请注意,strpos会返回找到的文字的位置。因此,例如,当您搜索的单词位于字符串的开头时,该函数将返回“0”。假设0是一个假值,当你使用像你所做的那样的函数时,即使发现了这个单词也不是真的。 strpos的正确用法是:

if (strpos($haystack, $needle) !== false) // Note the type check. 
{ 
    // your code...
}

此外,此功能默认情况下区分大小写。您可以使用stripos进行不区分大小写的搜索。

修改

从手册:

This function may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE

检查以下示例以便更好地理解:

strpos('the quick brown fox jumps over the lazy dog', 'the'); // Returns 0 (false value)
strpos('the quick brown fox jumps over the lazy dog', 'quick'); // Returns 4 (true value)
strpos('the quick brown fox jumps over the lazy dog', 'THE'); // Returns false (case sensitive)

答案 2 :(得分:0)

像Hauke P.提到的那样 - 不要用PHP做这件事。您希望使用数据库过滤匹配的行。如果您不想使用WHERE row LIKE %foo%,因为您需要更多功能,甚至可以在MYSQL中使用REGEX。只是不要用PHP处理数据。如果你这样做,那就是设计失败了。

查看有关LIKE,SELECT和REGEX的MySQL帮助文件。

提示:http://www.mysql.com/

答案 3 :(得分:-1)

如果未找到针,则

strpos()返回布尔值FALSE;如果找到,则为字符串中的偏移量的整数值。该偏移量可以为0,在松散比较中等于布尔值为FALSE。

使用

if(strpos($haveact, $username) !== FALSE)

答案 4 :(得分:-1)

strpos有可能返回0和FALSE,它们基本上是相同的“值”

您需要检查类型和值,如

strpos($haveact,$username) !== FALSE

答案 5 :(得分:-1)

另一种选择,我通常使用,因为它更短:)

if (strpos($haveact, $username) !== false) {
    // In string. 
}

答案 6 :(得分:-1)

作为替代方案,您可以尝试php的preg_match函数:

if (preg_match("/{$to_search}/" , $subject)) {
  // your code to process
}