我使用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
答案 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