使用preg_replace的PHP代码昨晚突然退出工作

时间:2015-08-06 20:42:47

标签: php

以下PHP代码在昨晚工作正常:

// _camelize(sVal, bFirst)
private function _camelize($sVal, $bFirst = false) {
  $sVal = preg_replace("/([_-\s]?([a-z0-9]+))/e", "ucwords('\\2')", $sVal);
  return ($bFirst ? strtolower($sVal[0]) : strtoupper($sVal[0])) . substr($sVal, 1);
}

它不再有效,在$ sVal上执行var_dump显示调用preg_replace()返回了null。

我联系了Bluehost,他们声称在夜间没有对(共享)服务器做任何事情。我特意问他们是否改变了PHP的版本。这是可疑的,因为preg_replace的文档特别提到了" \ e"修饰符在PHP 5.5.0中折旧,在PHP 7.0.0中完全删除。此帐户的CPanel目前表示正在使用PHP 5.4.43。

我将代码更改为以下内容:

// _camelize(sVal, bFirst)
private function _camelize($sVal, $bFirst = false) {
  $sVal = preg_replace_callback("/([_-\s]?([a-z0-9]+))/", 
    function($matches) {
      return ucwords($matches[2]);
    }, $sVal);

  return ($bFirst ? strtolower($sVal[0]) : strtoupper($sVal[0])) . substr($sVal, 1);
}

这适用于我的测试服务器(本地计算机上的LAMP),但仍然无法在生产服务器上运行。

为了让客户端的网站快速备份,我最终完全放弃了preg_replace调用,并编写了一些代码来创建和迭代数组。

任何人都可以解释可能发生的事情以及为什么第二个例子(使用preg_replace_callback)不起作用?它可能与Perl库有关吗?

感谢您的帮助

顺便说一句 - 这段代码的意图是采取类似" do-something-now"并返回一个字符串,如" doSomethingNow"。

2 个答案:

答案 0 :(得分:1)

听起来您的主机已将PHP更新为5.4.41之前的内容 您的正则表达式([_-\s]?([a-z0-9]+))仅在version 5.4.40 and prior上编译。

从5.4.41的patch notes,我们看到基础PCRE库已更新:

  

<强> PCRE:
  将pcrelib升级至8.37。 (CVE-2015-2325,CVE-2015-2326)

至于您的preg_replace_callback,假设您将所需的字符类更改为[_\s-],那么它应该在every version 5.3.0 onwards上工作。

答案 1 :(得分:0)

正则表达式对于如此简单的事情来说太复杂了。

function camel_hump($words, $first=false){
    $words = str_replace(" ","",ucwords(strtolower(str_replace("-"," ", $words))));
    return $first ? $words : lcfirst($words);
}
echo camel_hump("these-are-some-words");

在此处查看:http://3v4l.org/GNf2u