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

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











