搜索功能返回strpos()警告

时间:2014-10-17 08:01:27

标签: php wordpress

我使用this solution在wordpress中搜索短语。功能就是这个

function excerpt($text, $phrase, $radius = 100, $ending = "...") { 


     $phraseLen = strlen($phrase); 
   if ($radius < $phraseLen) { 
         $radius = $phraseLen; 
     } 

     $phrases = explode (' ',$phrase);

     foreach ($phrases as $phrase) {
         $pos = strpos(strtolower($text), strtolower($phrase)); 
         if ($pos > -1) break;
     }

     $startPos = 0; 
     if ($pos > $radius) { 
         $startPos = $pos - $radius; 
     } 

     $textLen = strlen($text); 

     $endPos = $pos + $phraseLen + $radius; 
     if ($endPos >= $textLen) { 
         $endPos = $textLen; 
     } 

     $excerpt = substr($text, $startPos, $endPos - $startPos); 
     if ($startPos != 0) { 
         $excerpt = substr_replace($excerpt, $ending, 0, $phraseLen); 
     } 

     if ($endPos != $textLen) { 
         $excerpt = substr_replace($excerpt, $ending, -$phraseLen); 
     } 

     return $excerpt; 

}

问题是,因为wordpress 4.0停止了工作,我收到Warning: strpos(): Empty needle警告。

我已经尝试检查$pos是否为空,空等。还有$text$phrase,但没有运气。

任何人都有解决这个问题的方法吗?

编辑:VolkerK的答案还可以,但是我想搜索不返回错误,所以我选择了:

if(empty($phrase)){
    return;
}

在功能的开头。工作良好。 :d

1 个答案:

答案 0 :(得分:1)

不知何故strtolower($phrase)在调用strpos时必须求值为空字符串,所以让我们使用一个过滤掉空(子)字符串的函数并进行更多测试。

$phrases = preg_split('!\s+!', $phrase, -1,  PREG_SPLIT_NO_EMPTY);
if ( empty($phrases) ) {
    trigger_error('empty phrase', E_USER_ERROR);
}

foreach ($phrases as $phrase) {
    $phrase = strtolower($phrase);
    if ( 0==strlen($phrase) ) {
        trigger_error('empty phrase', E_USER_ERROR);
    }
    $pos = strpos(strtolower($text), strtolower($phrase)); 
    if ($pos > -1) break;
}
// you probably should test ($pos > -1) here again

另见:
http://docs.php.net/preg_split
http://docs.php.net/trigger_error