我试图为我正在工作的网站创建自己的搜索引擎,我通过"标题"answers"描述"字段从包含关键字和显示结果的DB表。这工作得很好,但我想让页面只显示"description"结果中关键字周围的文本。我在StackOverflow (w00t!)上找到了一些代码来做到这一点:
$string = $s->description;
$word = $item;
preg_match("/('w+)? ?('w+)? ?('w+)? ?('w+)? ?('w+)? ?$word ?('w+)? ?('w+)? ?('w+)? ?('w+)? ?('w+)?/i",$string,$result);
$description = preg_replace("/$word/","<B>$word</B>",$result[0]);
问题是这会产生:
A PHP Error was encountered
Severity: Notice
Message: Undefined offset: 0
Filename: search/search.php
Line Number: 21
# 21行:
$description = preg_replace("/$word/","<B>$word</B>",$result[0]);
(来自上面的代码)但它只对部分结果这样做。我还没弄清楚坏的手机有什么共同点,但好像四分之一的手机都不起作用。
我尝试的解决方案是在foreach循环中检查变量$description是否isset()。(双关语不错吧?)
if( !isset($description) ) {
if(strlen($s->description) > 200) {
$description = substr($s->description, 0, 200).'...';
} else {
$description = $s->description;
}
}
否则变量已经在上面定义了。然而,这和不做任何检查,只是回显$description,因为它是在上面定义的(产生错误)没有什么不同。
我搜索了"未定义的偏移量:0",并被编程术语(其中我现在才开始理解)弄得有点不知所措。
我将非常感谢某种实际有效的检查或替代方法,因为这让我感到非常困惑。
我不确定我是否正确理解了问题的第二部分,但我可以建议这样做,以摆脱通知
$string = $s->description;
$word = $item;
if(preg_match("/('w+)? ?('w+)? ?('w+)? ?('w+)? ?('w+)? ?$word ?('w+)? ?('w+)? ?('w+)? ?('w+)? ?('w+)?/i",$string,$result)){
$description = preg_replace("/$word/","<B>$word</B>",$result[0]);
}
通过将preg_match放入if条件中,它只会在找到匹配时分配描述。
换句话说,如果没有找到匹配项,$result将是一个空数组(),因此没有$result[0]的值会触发您的通知
另外,因为$在正则表达式中有特殊的含义,所以我将把变量从引号中取出来作为"/('w+)? ?('w+)? ?('w+)? ?('w+)? ?".$word." ?('w+)? ?('w+)? ?('w+)? ?('w+)? ?('w+)?/i"
等。当在正则表达式中使用用户输入时,还要确保在$word
上使用preg_quote(),它们往往会意外地中断