2014-10-17 50 views
0

我使用this solution在wordpress中搜索短语。该功能是本搜索函数返回strpos()警告

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

不知何故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

+0

这将返回'致命错误:空phrase',我想这是因为'trigger_error( '空话',E_USER_ERROR)的;',对吧? – 2014-10-17 12:31:31