用strpos()检测" "或" "最快最准,因换行符是单字节ASCII;需注意textarea提交统一为" ",而Unicode换行符U+2028/U+2029需额外正则匹配。

PHP怎么检测字符串里有没有换行符
直接用 strpos() 查找 "
" 或 "
" 最快,但要注意:Windows 的换行是 "
",Mac 旧系统用 "
",Linux/macOS 新系统用 "
"。只查 "
" 会漏掉纯 "
" 换行(少见但存在)。
推荐写法:
if (strpos($content, "
") !== false || strpos($content, "
") !== false) {
// 含换行符
}
不建议用 preg_match('/[
]/', $content) —— 正则开销大,且没额外收益。
file_get_contents() 读出来的文件内容怎么判断含换行
注意 file_get_contents() 默认不修改内容,换行符原样保留。但如果你后续用了 trim() 或 explode("
", ...) 等操作,可能掩盖原始换行状态。
立即学习“PHP免费学习笔记(深入)”;
实操要点:
- 检测必须在任何“清洗”操作前做
- 若文件是二进制或编码未知(如 GBK),
" "字节仍可安全匹配,不影响判断 - 大文件别全读进内存再查;改用
fopen()+fgets()逐行读,发现首行有换行就返回 true
为什么 mb_strpos() 不能替代 strpos() 检测换行符
mb_strpos() 是为多字节字符设计的,而 "
" 和 "
" 是单字节 ASCII 控制符,在所有编码下都占 1 字节。用 mb_strpos($s, "
") 不仅没必要,还慢 2–3 倍(尤其短字符串)。
例外情况只有:你明确在处理自定义编码且该编码把 0x0A 当作多字节序列的一部分(现实中几乎不存在)。
结论:一律用 strpos(),别碰 mb_strpos() 查换行。
从表单 textarea 提交的内容如何可靠检测换行
浏览器提交时,textarea 的换行统一转成 "
"(无论源系统),但 PHP 接收后,$_POST 或 $_REQUEST 中的值已解码,"
" 就是字面量。
容易踩的坑:
- 用了
addslashes()或 magic quotes(已废弃但遗留代码可能有)→" "变成"\n",检测失效 - 前端 JS 用
.replace(/ /g, '<br>')
渲染,但没改提交值 → 不影响后端检测 - 用户粘贴内容带 Unicode 换行符(如 U+2028、U+2029)→
strpos()查不到,需额外正则:preg_match('/[ ]/u', $s)
U+2028/U+2029 极少见,除非用户从某些编辑器或 JSON 直接粘贴,普通 textarea 不会产生。日常检测 "
" 和 "
" 足够。



















