如果引用或轉貼,麻煩註明出處與本網誌連結,否則視為侵權。

2020年12月8日

PHP解決錯誤訊息 "preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead"的方法

作者: Fred F.M. Wang (FW知識瑣記) 日期: 2020/12/8

Codeigniter 搭配PHP 5.5版時,前端程式(View)送出(Submit)表單資料到後台程式(controller)

時發生錯誤訊息  core\Security.php : "preg_replace(): The /e modifier is deprecated, use 

preg_replace_callback instead"


錯誤的程式 : \system\core\Security.php 

錯誤的行: line 152, 153

$str = preg_replace('~&#x(0*[0-9a-f]{2,5})~ei', 'chr(hexdec("\\1"))', $str);

return preg_replace('~&#([0-9]{2,4})~e', 'chr(\\1)', $str);


原因 : /e 修飾符在PHP 5.5中已經棄用, 要用preg_replace_callback()取代


查到PHP官網的解釋

/e修飾符在PHP 5.5已不推薦使用會產生Warning, 在PHP 7已經移除, 因為它很容易產生安漏

洞,可以使用preg_replace_callback()取代

   

官網說明內容如下 (ref : https://www.php.net/manual/zh/reference.pcre.pattern.modifiers.php)

因此Codeigniter系統的 \system\core\Security.php程式中line 152, 153

$str = preg_replace('~&#x(0*[0-9a-f]{2,5})~ei', 'chr(hexdec("\\1"))', $str);

return preg_replace('~&#([0-9]{2,4})~e', 'chr(\\1)', $str);


要改寫成

$str = preg_replace_callback('~&#x(0*[0-9a-f]{2,5})~i', function($m){ return chr(hexdec($m[1])); }, $str);

return preg_replace_callback('~&#([0-9]{2,4})', function($m){ return chr(hexdec($m[1])); }, $str);


如此問題就解決了。


沒有留言:

張貼留言

歡迎提供意見, 謝謝 (註 : 留言經過版主審核通過才會發布)