用preg_replace_callback替换preg_replace仍然失败

时间:2016-06-28 04:39:36

标签: php preg-replace-callback

我正致力于将SocialEngine移植到PHP7上工作。

在默认安装中,我收到以下错误:

preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in 
<b>/home/vagrant/code/mysite/project/app/application/libraries/Scaffold/modules/NestedSelectors/NestedSelectors.php</b>
on line <b>300</b>

该错误的代码如下所示:

$xml = preg_replace('/([-_A-Za-z*]+)\s*:\s*([^;}{]+)(?:;)/ie', "'<property name=\"'.trim('$1').'\" value=\"'.trim('$2').'\" />\n'", $xml);

我将其替换为preg_replace_callback,如此:

$xml = preg_replace_callback('/([-_A-Za-z*]+)\s*:\s*([^;}{]+)(?:;)/ie', function($matches) {
    return "'<property name=\"'.trim('$matches[1]').'\" value=\"'.trim('$matches[2]').'\" />\n'";
}, $xml);

现在我收到了这个错误:

preg_replace_callback(): The /e modifier is no longer supported, use preg_replace_callback instead in 
<b>/home/vagrant/code/mysite/project/app/application/libraries/Scaffold/modules/NestedSelectors/NestedSelectors.php</b> 
on line <b>304</b>

这对我来说似乎有效,我做错了什么?

2 个答案:

答案 0 :(得分:0)

而不是

    $xml = preg_replace_callback('/([-_A-Za-z*]+)\s*:\s*([^;}{]+)(?:;)/ie', function($matches) {
    return "'<property name=\"'.trim('$matches[1]').'\" value=\"'.trim('$matches[2]').'\" />\n'";
}, $xml);

    $xml = preg_replace_callback('/([-_A-Za-z*]+)\s*:\s*([^;}{]+)(?:;)/i', function($matches) {
    return "'<property name=\"'.trim('$matches[1]').'\" value=\"'.trim('$matches[2]').'\" />\n'";
}, $xml);

我所做的就是删除e

中的../ie

快乐的编码......

答案 1 :(得分:0)

现在我对与此错误或其含义相关的任何内容一无所知,但我发现了解决此错误的内容:

来自https://www.drupal.org/project/views_slideshow/issues/1872616 他们在谈论修复这种神奇药水的地方:

  

我发现此文件中有四个位置需要更改。   这两个已经提到过,然后又有两次preg_replace   被使用了。对我来说,他们在186 + 277线附近。

     

在186和277我取代了

    $vars['location'] => array(
      'type' => preg_replace('/_(.?)/e',"strtoupper('$1')", $vars['settings']['type']),
    ),
     

    $vars['location'] => array(
      'type' => preg_replace_callback(   // php5.x preg_replace_callback() method
        '/_(.?)/',
        function ($m) {
          return strtoupper($m[1]);
        },
        $vars['settings']['type']),
    ),

所以我拿了原始代码:

// Loop through all the addons and call their methods if needed.
foreach ($addons as $addon_id => $addon_info) {
  foreach ($addon_info['accepts'] as $imp_key => $imp_value) {
    if (is_array($imp_value)) {
      $methods[$imp_key][] = preg_replace('/_(.?)/e',"strtoupper('$1')", $addon_id);
    }
    else {
      $methods[$imp_value][] = preg_replace('/_(.?)/e',"strtoupper('$1')", $addon_id);
    }
  }
}

然后把它煮熟并修复这些元素:

原件:

preg_replace('/_(.?)/e',"strtoupper('$1')", $vars),),

修正:

preg_replace_callback('/_(.?)/', function ($m) { return strtoupper($m[1]); }, $vars), ),

他们结合起来:

preg_replace_callback('/_(.?)/', function ($m) { return strtoupper($m[1]); }, $addon_id);

在我尝试使用的主题的背景下,成为:

// Loop through all the addons and call their methods if needed.
foreach ($addons as $addon_id => $addon_info) {
  foreach ($addon_info['accepts'] as $imp_key => $imp_value) {
    if (is_array($imp_value)) {
      $methods[$imp_key][] = preg_replace_callback('/_(.?)/', function ($m) { return strtoupper($m[1]); }, $addon_id);
    }
    else {
      $methods[$imp_value][] = preg_replace_callback('/_(.?)/',function ($m) { return strtoupper($m[1]); }, $addon_id);
    }
  }
}

我还会说,错误中给出了文件位置非常方便,这样我就可以修复一个不可知的问题。