如何不为产生“未定义偏移量:0”的项目在循环中运行代码?


How do I not run code in loop for items producing "Undefined offset: 0"?

我试图为我正在工作的网站创建自己的搜索引擎,我通过"标题"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(),它们往往会意外地中断