如何修正PHP函数以正确识别文件中的所有换行符类型
修正后的函数实现
问题核心是原函数的正则表达式存在HTML转义错误,且未通过断言正确区分组合换行符与独立换行符,导致将\r\n误拆分为两种单独类型。以下是修正后的实现:
function ddtt_get_file_eol( $file_contents, $incl_code = true ) { // 关联换行符类型标识与对应匹配正则 $eol_types = [ '\r\n' => '/\r\n/', '\n' => '/(?<!\r)\n/', // 仅匹配前面无\r的独立\n '\r' => '/\r(?!\n)/' // 仅匹配后面无\n的独立\r ]; $found = []; foreach ( $eol_types as $type_label => $regex ) { if ( preg_match( $regex, $file_contents ) ) { $formatted = $incl_code ? '<code class="hl">'.$type_label.'</code>' : $type_label; $found[] = $formatted; } } return $found; }
关键修正说明
- 正则修复:将原代码中被HTML转义的
(?<!\r)改为正确的负后顾断言(?<!\r),(?>!\n)改为负前瞻断言(?!\n),确保仅匹配独立存在的\n和\r,不会把\r\n中的字符误判为单独类型。 - 逻辑优化:将换行符类型标识与正则直接绑定,代码更简洁易维护;同时优先检查
\r\n组合类型,符合识别优先级。
测试场景验证
- 仅含
\r\n的文件:返回['\r\n'](或带标签的格式化版本) - 仅含
\n的文件:返回['\n'] - 仅含
\r的文件:返回['\r'] - 同时含
\r\n和\n的文件:返回['\r\n', '\n'] - 同时含三种换行符的文件:返回
['\r\n', '\n', '\r']
内容的提问来源于stack exchange,提问作者Aristocles
相关产品推荐
相关产品推荐

