in_array() 找不到含换行符的字符串,因换行符不可见且系统差异导致字面量匹配失败;应先用 var_dump() 或 bin2hex() 查看真实字节,再用 trim() 预处理或 array_filter() 精准筛选。

为什么 in_array() 找不到含换行符的字符串
因为换行符(\n、\r\n)是不可见字符,直接用 in_array('abc\n', $arr) 看似匹配,实则常因空白差异失败。PHP 默认不忽略首尾空白,且不同系统换行符不同(Linux 用 \n,Windows 用 \r\n),导致字面量写法极易出错。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 别依赖肉眼判断字符串内容,先用
var_dump()或bin2hex()查看真实字节,比如bin2hex("a\n")返回'610a' - 避免硬编码换行符,改用
PHP_EOL表示当前系统标准换行符 - 若数据来自表单或文件,换行符可能混有空格,建议统一用
trim()预处理
用 array_filter() 精准筛选含换行符的元素
这是最常用也最可控的方式:遍历并检测每个值是否包含换行符(或特定空白组合)。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 检测是否含
\n:array_filter($arr, fn($v) => str_contains($v, "\n"))(PHP 8.0+) - 兼容旧版 PHP:
array_filter($arr, function($v) { return strpos($v, "\n") !== false; }) - 要同时匹配
\r\n和\n,可用正则:array_filter($arr, fn($v) => preg_match('/[\r\n]/', $v)) - 注意:正则方式性能略低,大数据量时优先用
str_contains()或strpos()
用 array_map() + trim() 清洗后再筛选
很多“含换行符”的需求本质是想排除脏数据(如用户粘贴时带了多余回车),此时清洗比筛选更合理。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 先统一清理:
$cleaned = array_map('trim', $arr),它会去掉首尾\n、\r、\t、空格等 - 再筛出“清洗前后不一致”的项(即原值确实含首尾换行):
array_keys(array_filter($arr, fn($v) => $v !== trim($v))) - 若需保留原始键名,别用
array_values()重置,否则丢失上下文
从文件读取时换行符自动截断导致筛选失效
用 file() 读取文本时,默认每行末尾的换行符会被保留;但用 file_get_contents() + explode("\n", ...) 则容易漏掉最后一行换行,或把 \r\n 拆成两个空元素。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 用
file('data.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)—— 自动去每行末换行符且跳过空行 - 若必须用
explode(),先统一替换:str_replace("\r\n", "\n", $content)再explode("\n", ...) - 检查数组是否有多余空字符串:
array_filter($arr, 'strlen')可快速剔除纯空白项
\n、\r\n 还是混着 \r 的遗留数据。多打一行 bin2hex($arr[0]) 比猜半天快得多。











