如何使preg_replace在所有PHP环境中都工作?
我使用preg_replace的函数在dev服务器上运行得很好,但在生产服务器上却完全没有。问题可能与编码有关。有没有一种方法可以使这个表达式在不考虑编码的情况下工作 $config如下所示:如何使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` "));
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';......