如何使preg_replace在所有PHP环境中都工作?

如何使preg_replace在所有PHP环境中都工作?,php,encoding,preg-replace,Php,Encoding,Preg Replace,我使用preg_replace的函数在dev服务器上运行得很好,但在生产服务器上却完全没有。问题可能与编码有关。有没有一种方法可以使这个表达式在不考虑编码的情况下工作 $config如下所示: class JConfig { public $mighty = array("0" => array("0" => "/`?\\#__mightysites[` \\n]+/u"), "1" => array("0" => "`hhd_mightysites` "));

我使用preg_replace的函数在dev服务器上运行得很好,但在生产服务器上却完全没有。问题可能与编码有关。有没有一种方法可以使这个表达式在不考虑编码的情况下工作

$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 . ", ";
    }
}
同样,它在我们的开发服务器上工作得非常好。它不会对生产服务器上的任何行执行任何操作。我也知道,它通过了STRPO,就像通过preg_替换进入生产线一样。我能让preg_代替环保型吗


我感谢您的帮助,因为它只发生在生产服务器上,所以很难测试

最安全的方法是不要“信任”任何您希望匹配的文本空格/制表符

与使用
\t
不同,我建议在需要选项卡的地方使用
\s+
,在需要空格的地方使用
\s

此外,为了涵盖操作系统可能在每行末尾使用
\r\n
\n
的情况,您可以使用
\r
来匹配这两种变体

我将通过模式开头的
^
m
包含行开始字符检查,作为模式修改器。这确保我们匹配并且仅匹配您希望在行首出现
\t
的位置

最后,
preg_replace()
有一个可选的第5个参数,用于计算进行了多少次替换。如果
$found
是非零值,则存储当前
$var

代码:()


p、 最后一个建议的改进。。。如果您的项目实际上不需要
$tempvar
变量(这意味着您仅在调试期间使用此变量),那么您可以完全避免循环,只需
内爆(“|”),$strips)
,将生成的字符串包装在
,另存为
$var
,然后调用
preg\u replace()
就一次。这将更加有效,而且您的示例
$strips
数据不需要使用
preg_quote()
来准备,因为您需要转义“特殊字符”。

最安全的方法是不要“信任”任何您希望匹配的文本空格/制表符

与使用
\t
不同,我建议在需要选项卡的地方使用
\s+
,在需要空格的地方使用
\s

此外,为了涵盖操作系统可能在每行末尾使用
\r\n
\n
的情况,您可以使用
\r
来匹配这两种变体

我将通过模式开头的
^
m
包含行开始字符检查,作为模式修改器。这确保我们匹配并且仅匹配您希望在行首出现
\t
的位置

最后,
preg_replace()
有一个可选的第5个参数,用于计算进行了多少次替换。如果
$found
是非零值,则存储当前
$var

代码:()


p、 最后一个建议的改进。。。如果您的项目实际上不需要
$tempvar
变量(这意味着您仅在调试期间使用此变量),那么您可以完全避免循环,只需
内爆(“|”),$strips)
,将生成的字符串包装在
,另存为
$var
,然后调用
preg\u replace()
就一次。这将更加有效,您的示例
$strips
数据不需要使用
preg_quote()
来准备,因为您需要转义“特殊字符”。

什么不起作用?是否会导致错误?源文件是否相同?或者服务器上的一个可以使用
\r
而不是
\n
?您不需要转义正则表达式中的所有内容。等号和分号并不是特别的,而且其中还有一个不需要的组。这应该足够了:
“/\tpublic\$”$变量''=[^;]+;\n/u'
或者,因为您不关心内容
“/^\s*public\$”$变量''=.*$/'
应该可以。不可以,只返回与preg_替换之前完全相同的行/文件。我怀疑它不匹配。我从两台不同的服务器上新复制了两个文件到winmerge,它是100%红色的。所以我认为这意味着服务器对它们进行了不同的编码?也许这就是它不匹配的原因?在dev服务器上工作的更改,您认为这会解决生产服务器上的问题吗?什么不工作?是否会导致错误?源文件是否相同?或者服务器上的一个可以使用
\r
而不是
\n
?您不需要转义正则表达式中的所有内容。等号和分号并不是特别的,而且其中还有一个不需要的组。这应该足够了:
“/\tpublic\$”$变量''=[^;]+;\n/u'
或者,因为您不关心内容
“/^\s*public\$”$变量''=.*$/'
应该可以。不可以,只返回与preg_替换之前完全相同的行/文件。我怀疑它不匹配。我从两台不同的服务器上新复制了两个文件到winmerge,它是100%红色的。所以我认为这意味着服务器对它们进行了不同的编码?也许这就是它不匹配的原因?在dev服务器上进行的更改,您认为这会解决生产服务器上的问题吗?谢谢!我会在12小时内测试它。工作得很好。感谢您实施$FOND-非常有用!谢谢我会在12小时内测试它。工作得很好。感谢您实施$FOND-非常有用!
$config = <<<'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';......
CONFIG;

$strips = [
    'mighty',
    'mighty_enable',
    'mighty_sync',
    'mighty_language',
    'mighty_template'
];

$tempvar = '';
foreach ($strips as $var) {
    $config = preg_replace('~^\s+public\s\$' . $var . '\s=\s[^;]*;\R~um', '', $config, -1, $found);
    if ($found) {
        $tempvar .= $var . ", ";
    }
}
echo "\$tempvar = $tempvar\n\n";
echo $config;
$tempvar = mighty, mighty_enable, mighty_language, mighty_template, 

class JConfig {
    public $mighty_home = '';
    public $mighty_langoverride = '0';......