in_array() 找不到含换行符的字符串,因换行符不可见且系统差异导致字面量匹配失败;应先用 var_dump() 或 bin2hex() 查看真实字节,再用 trim() 预处理或 array_filter() 精准筛选。
in_array() 找不到含换行符的字符串因为换行符(\n、\r\n)是不可见字符,直接用 in_array('abc\n', $arr) 看似匹配,实则常因空白差异失败。PHP 默认不忽略首尾空白,且不同系统换行符不同(Linux 用 \n,Windows 用 \r\n),导致字面量写法极易出错。
实操建议:
var_dump() 或 bin2hex() 查看真实字节,比如 bin2hex("a\n") 返回 '610a'
PHP_EOL 表示当前系统标准换行符trim() 预处理array_filter() 精准筛选含换行符的元素这是最常用也最可控的方式:遍历并检测每个值是否包含换行符(或特定空白组合)。
实操建议:
\n:array_filter($arr, fn($v) => str_contains($v, "\n"))(PHP 8.0+)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() 清洗后再筛选很多“含换行符”的需求本质是想排除脏数据(如用户粘贴时带了多余回车),此时清洗比筛选更合理。
实操建议:
$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 拆成两个空元素。
实操建议:

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]) 比猜半天快得多。