我有以下代码来处理配置文件:

<?php
$config = '[log]
log_writers[] = "file"
log_writers[] = "screen"

[General]
maintenance_mode = 0
enable_browser_archiving_triggering = 0
enable_sql_optimize_queries = 0
force_ssl = 1';

echo preg_match_all( '/^maintenance_mode[ \t]*=[ \t]*\d$/m', $config );

回声显示0

https://onlinephp.io/c/51407

将正则表达式更新为:

echo preg_match_all( '/^maintenance_mode[ \t]*=[ \t]*\d\s$/m', $config );

结果在预期的1

为什么??


我甚至在regex101中验证了我的理智

https://regex101.com/r/CIxCkN/1


本地测试环境:

RHEL 7
PHP 5.6.25
PCRE v8.32 2012-11-30

Windows Server 2022
PHP 8.2.7
PCRE v10.40 2022-04-14


每个 comments 请求:

var_dump(base64_encode($config));

字符串(240)‘W2xvZ10NCmxvZ193cml0ZXJzW10gPSAiZmlsZSINCmxvZ193cml0ZXJzW10gPSAic2NyZWVuIg0KDQpbR2VuZXJhbF0NCm1haW50ZW5hbmNlX21vZGUgPSAwDQplbmFibGVfYnJvd3d3cm

var_dump(bin2hex($config));

字符串(358)"5b6c6f675d0d0a6c6f675f777269746572735b5d203d202266696c65220d0a6c6f675f777269746572735b5d203d202273637265656e220d0a0d0a5b47656e6572616c5d0d0a6d61696e74656e616e63655f6d6f6465203d20300d0a656e61626c655f62726f777365725f617263686976696e675f74726967676572696e67203d20300d0a656e61626c655f73716c5f6f7074696d697a655f71756572696573203d20300d0a666f7263655f73736c203d2031"

推荐答案

一个答案是,您的字符串(或通常是脚本)具有Windows行结尾.

在多行模式下,\d$将仅匹配后面紧跟换行符的数字(由PCRE的编译时设置确定),如果其中隐藏了\r,则可能不起作用.

在正则表达式的末尾添加\s将匹配所有行结束字符,这就解释了为什么这在受影响的测试环境中很有用.

对于修复(除了您已经找到的\s个附加字符),PCRE允许您使用字符串开头的修饰符来调整哪些字符作为换行符匹配,例如(*ANYCRLF):

// Force Windows line-ending
<?php
$test = "foo\r\nbar";

var_dump(preg_match_all('/^foo$/m', $test));
var_dump(preg_match_all('/(*ANYCRLF)^foo$/m', $test));

int(0)
int(1)

有关演示,请参见https://3v4l.org/vOUgM,有关详细信息,请参阅PCRE docsNewline Conventions部分.

或者,只需在字符串中使用PCRE在本地需要的换行符(S).


更广泛地说,如果您实际上正在try 解析问题中的字符串/文件,则array_key_existsparse_ini_string/parse_ini_file的组合将使一切变得清晰得多.

Php相关问答推荐

仅显示特定WooCommerce产品类别的额外产品字段

PHP cUrl扩展与v8.2.12更新损坏

有什么方法可以阻止WordPress主题升级通知吗?

WooCommerce购物车中仅允许一个可下载产品

创建一个新的可变产品及其属性以用于WooCommerce中的变体

Laravel POST方法返回状态:POST方法上不允许使用405方法

laravel中获取的数据会自动更改时间戳值

在PHP 8.2 Gloogle云引擎上加载大型php文件速度缓慢

Codeigniter 4中的未定义变量$HOME

用户注册表单中的 HTTP 错误 405

Woocommerce 临时购物车税未根据第一个请求正确计算

PHP:数组的等边

在 PHP 8.2 中使用 PHP Spreadsheet 和 CodeIgniter 3 导出 Excel 时出错

htaccess Rewriterule 无法以任何方式工作

如何通过帖子自定义元数据进行查询

Laravel 8:会话不适用

PDO 和 SQL 查询结果中日期格式不同的原因可能是什么?

PHP Loop 在迭代中使用修改后的数据

NetBeans 不显示中文内容

在 WooCommerce 结帐后更新用户元字段