以下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"。
答案 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