【发布时间】:2018-11-09 22:43:37
【问题描述】:
我使用 preg_replace 的函数在开发服务器上运行良好,但在生产服务器上根本不行。该问题可能与编码有关。有没有办法让这个表达式不管编码如何都能工作?
$config 看起来像这样:
class JConfig {
public $mighty = array("0" => array("0" => "/`?\\#__mightysites[` \\n]+/u"), "1" => array("0" => "`hhd_mightysites` "));
public $mighty_enable = '0';
public $mighty_language = '';
public $mighty_template = '9';
public $mighty_home = '';
public $mighty_langoverride = '0';......
我将与我想剥离的行相关的变量放在一个名为 strips like 的数组中
$strips = array(
'mighty',
'mighty_enable',
'mighty_sync',
'mighty_language',
'mighty_template',.....
然后使用循环将这些行去掉:
foreach ($strips as $var) {
if (JString::strpos($config, 'public $' . $var . ' =') !== false) {
$config = preg_replace('/\tpublic \$' . $var . ' \= ([^\;]*)\;\n/u', '', $config);
$tempvar .= $var . ", ";
}
}
再次,它在我们的开发服务器上完美运行。它不会对生产服务器上的任何行做任何事情。我也知道它通过 strpos 喜欢到达 preg_replace 行。我可以做 preg_replace 环境证明吗?
感谢您的帮助,因为它只发生在生产服务器上,很难测试!
【问题讨论】:
-
什么不起作用?它会导致错误吗?
-
源文件一样吗?或者服务器上的那个有
\r而不是\n? -
您不需要转义正则表达式中的所有内容。等号和分号并不特殊,而且你也有一个不需要的组。这应该足够了:
'/\tpublic \$' . $var . ' = [^;]+;\n/u'或者,因为你不关心内容,'/^\s*public \$' . $var . ' =.*$/'应该没问题。 -
不,只返回与 preg_replace 之前完全相同的行/文件。我怀疑它不匹配。我将两个不同服务器的两个文件从我的电脑新复制到 winmerge 中,它是 100% 红色的。所以我相信服务器对它们进行不同编码的方式?也许这就是它不匹配的原因?
-
开发服务器上的更改有效,您认为这会解决生产服务器上的问题吗?
标签: php encoding preg-replace