2015-05-09 47 views
0

得益於信息this post我已經成功地設法大部分的preg_replace陳述我需要更新到preg_replace_callback語句轉換後「未定義抵消」。轉換的preg_replace到preg_replace_callback

然而,當我轉換了如下聲明:

$body_highlighted = preg_replace('/((<[^>]*)|' . preg_quote(strtr($query, array('\'' => '&#039;')), '/') . ')/ie' . ($context['utf8'] ? 'u' : ''), 
    "'\$2' == '\$1' ? stripslashes('\$1') : '<strong class=\"highlight\">\$1</strong>'", 
     $body_highlighted); 

$body_highlighted = preg_replace_callback('/((<[^>]*)|' . preg_quote(strtr($query, array('\'' => '&#039;')), '/') . ')/i' . ($context['utf8'] ? 'u' : ''), 
    function ($matches) { 
     return $matches[2] == $matches[1] ? stripslashes($matches[1]) : "<strong class=highlight>$matches[1]</strong>"; 
    }, 
     $body_highlighted); 

錯誤消息'未定義抵消:2'發生(原的preg_replace語句不會產生這個錯誤)。

我花了幾個小時試圖解決這個問題,但是,因爲我從來沒有做過PHP編程,我真的不知道爲什麼它不工作或如何解決它。

回答

0

您的圖案包含一個替代。在這個交替的第一個分支中,組2被定義,但在第二個分支中它不是真的。因此,如果第二支成功捕獲組2未定義(爲$matches[2]

爲了解決你只需要測試是否與isset()

存在$matches[2]這個問題,但你可以在一個更簡單的方法,如果寫這個你刪除無用的捕獲組,附上所有的模式:

$pattern = '/(<[^>]*)|' . preg_quote(str_replace("'", '&#039;', $query), '/') 
     . '/i' . ($context['utf8'] ? 'u' : ''); 

$body_highlighted = preg_replace_callback($pattern, function ($m) { 
    return isset($m[1]) ? stripslashes($m[0]) 
         : '<strong class="highlight">' . $m[0] . '</strong>'; 
}, $body_highlighted); 
+0

我想我可能需要使用isset(),但我不知道如何/在哪裏把它放在這個聲明。 – GL700Wing

+1

非常好 - 非常感謝! (只需改變'$ query)))'到'$ query))'來讓它工作。 – GL700Wing

+0

@ GL700Wing:的確,我沒有看到它。 –

相關問題