我有这段代码来处理配置文件:
<?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
将正则表达式更新为:
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
根据评论请求:
var_dump(base64_encode($config));
字符串(240)“W2xvZ10NCmxvZ193cml0ZXJzW10gPSAiZmlsZSINCmxvZ193cml0ZXJzW10gPSAic2NyZWVuIg0KDQpbR2VuZXJhbF0NCm1haW50ZW5hbmNlPSA21vZGUgwDQplbmFibGVfY nJvd3Nlcl9hcmNoaXZpbmdfdHJpZ2dlcmluZyA9IDANCmVuYWJsZV9zcWxfb3B0aW1pemVfcXVlcmllcyA9IDANCmZvcmNlX3NzbCA9IDE="
var_dump(bin2hex($config));
字符串(358)“5b6c6f675d0d0a6c6f675f777269746572735b5d203d202266696c65220d0a6c6f675f777269746572735b5d203d202273637265656e220d0a0 d0a5b47656e6572616c5d0d0a6d61696e74656e616e63655f6d6f6465203d20300d0a656e61626c655f62726f777365725f617263686976696e675f7472 6967676572696e67203d20300d0a656e61626c655f73716c5f6f7074696d697a655f71756572696573203d20300d0a666f7263655f73736c203d2031"
一种答案是您的字符串(或通常的脚本)具有 Windows 行结尾。
在多行模式下,将仅匹配一个数字后跟一个立即换行符(由 PCRE 的编译时设置确定),如果其中隐藏,
\d$
则可能不起作用。\r
\s
在正则表达式末尾添加将匹配所有行结束字符,这解释了为什么这对受影响的测试环境有帮助。对于修复(除了
\s
您已经找到的添加之外),PCRE 允许您使用字符串开头的修饰符来调整哪些字符作为换行符进行匹配,例如(*ANYCRLF)
:有关演示,请参阅https://3v4l.org/vOUgM ,有关详细信息,请参阅PCRE 文档的换行约定部分。
或者,只需在字符串中使用 PCRE 在本地期望的换行符。
array_key_exists
更一般地说,如果您实际上正在尝试解析问题中的字符串/文件,那么和的组合parse_ini_string/parse_ini_file
将使一切变得更加清晰。