PHP 5.5 Bug-不推荐使用的功能:preg_replace()


16

升级到PHP 5.5后,添加网站,商店或商店视图时出现以下错误。Magento 1.9.0.1中仍然存在此错误

Exception message: Deprecated functionality: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in app/code/core/Mage/Core/Helper/Abstract.php on line 238
Trace: #0 [internal function]: mageCoreErrorHandler(8192, 'preg_replace():...', 'app...', 238, Array)
#1 app/code/core/Mage/Core/Helper/Abstract.php(238): preg_replace('# <(?![/a-z]) |...', 'htmlentities('$...', 'New Store Name')
#2 app/code/core/Mage/Adminhtml/controllers/System/StoreController.php(175): Mage_Core_Helper_Abstract->removeTags('New Store Name')
#3 app/code/core/Mage/Core/Controller/Varien/Action.php(418): Mage_Adminhtml_System_StoreController->saveAction()
#4 app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('save')
#5 app/code/core/Mage/Core/Controller/Varien/Front.php(172): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#6 app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#7 app/Mage.php(686): Mage_Core_Model_App->run(Array)
#8 index.php(87): Mage::run('', 'store')
#9 {main}

这是产生错误的代码

该代码可以在 Mage_Core_Helper_Abstract

/**
 * Remove html tags, but leave "<" and ">" signs
 *
 * @param   string $html
 * @return  string
 */
public function removeTags($html)
{
    $html = preg_replace("# <(?![/a-z]) | (?<=\s)>(?![a-z]) #exi", "htmlentities('$0')", $html);
    $html =  strip_tags($html);
    return htmlspecialchars_decode($html);
}

我认为,这是该方法最简单的补丁:

/**
 * Remove html tags, but leave "<" and ">" signs
 *
 * @param   string $html
 * @return  string
 */
public function removeTags($html)
{
    $html = preg_replace_callback("# <(?![/a-z]) | (?<=\s)>(?![a-z]) #xi",
        create_function('$matches', 'return htmlentities($matches);'),
        $html
    );
    $html =  strip_tags($html);
    return htmlspecialchars_decode($html);
}

该方法仅由 Mage_Adminhtml_System_StoreController::storeAction()

可以在三个位置修复它:

  1. Mage_Core_Helper_Abstract =>这是该方法所在的位置,但由于接触核心文件而很烂。
  2. 重写Mage_Core_Helper_Abstract =>它是一个抽象类,因此不应该/不应该对其进行重写。
  3. 重写Mage_Adminhtml_Helper_Data并在其中添加方法。=>我认为这是要走的路。

你们有什么感想?

  1. 选项#3是解决此问题的正确方法吗?
  2. 我补丁中的代码正确吗?

问题仍然存在于1.9.1 CE和1.14.1 EE

Answers:


13

你是对的。修复adminhtml帮助器。这是我使用的修复程序的差异:

--- app/code/core/Mage/Core/Helper/Abstract.php.orig 2014-09-25 15:32:56.000000000 +0200
+++ app/code/core/Mage/Core/Helper/Abstract.php 2014-09-25 15:34:42.000000000 +0200
@@ -235,7 +235,9 @@
  */
 public function removeTags($html)
 {
-        $html = preg_replace("# <(?![/a-z]) | (?<=\s)>(?![a-z]) #exi", "htmlentities('$0')", $html);
+        $html = preg_replace_callback("# <(?![/a-z]) | (?<=\s)>(?![a-z]) #xi", function($matches) {
+            return htmlentities($matches[0]);
+        }, $html);
         $html =  strip_tags($html);
         return htmlspecialchars_decode($html);
 }

这是一个测试,以确认行为与php 5.4相同:

<?php

namespace Vinai\Kopp\Magento\Tests;

class MageAdminhtmlHelperDataTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var \Mage_Adminhtml_Helper_Data
     */
    private $helper;

    static public function setUpBeforeClass()
    {
        ini_set('display_errors', 1);
        umask(0);
        error_reporting(E_ALL);
        require_once 'app/Mage.php';
        \Mage::setIsDeveloperMode(true);
    }

    public function setUp()
    {
        $this->helper = new \Mage_Adminhtml_Helper_Data();
    }

    /**
     * @covers \Mage_Core_Helper_Abstract::removeTags
     * @dataProvider removeTagsDataProvider
     */
    public function testRemoveTags($inputHtml, $expected)
    {
        $result = $this->helper->removeTags($inputHtml);
        $this->assertEquals($expected, $result);
    }

    public function removeTagsDataProvider()
    {
        return array(
            array('<b>', ''),
            array('<b> >', ' >'),
            array('<b> <', ' <'),
            array('<b/> </', ' '),
            array('< <b/>', '< '),
            array('> <b/>', '> '),
            array('</ <b/>', ''),
            array('x />', 'x />'),
            array('> <', '> <'),
            array('>>', '>>'),
            array('<<', '<<'),
            array('<>', '<>'),
        );
    }
} 


3

简短答案:Magento与PHP 5.5不兼容,请勿将您的网络服务器更新为5.5。

更长的答案:我想,Magento会在下一个版本中修复此错误,所以我只做一个核心hack,并希望是最好的。抱歉,我不知道代码是否正确。


嗨,Fabian,我们在PHP 5.5上运行所有服务器已有相当一段时间了。这是我遇到的第一个问题。还有哪些其他已知的不兼容性,或者此信息来自何处?
RobM84 2014年

1
我不知道。您只需检查changelog php.net/manual/en/migration54.php和grep中的方法和ini设置即可
Fabian Blechschmidt 2014年

1
实际上,这是magento CE中唯一的PHP 5.5问题,我们在上半年没有遇到另一个问题
Flyingmana 2014年

2
这也是一个非常糟糕的建议,因为5.3已过时,php 5.4从未达到真正的稳定状态,因为大多数人将其与APC一起使用,5.5是目前唯一可用的最低稳定的PHP版本,更不用说所有不是包括在旧版PHP中
Flyingmana
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.