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

php怎么检测字符串里有没有换行符
直接用 strpos() 查找 "n" 或 "r" 最快,但要注意:windows 的换行是 "rn",mac 旧系统用 "r",linux/macOS 新系统用 "n"。只查 "n" 会漏掉纯 "r" 换行(少见但存在)。
推荐写法:
if (strpos($content, "n") !== false || strpos($content, "r") !== false) { // 含换行符 }
不建议用 preg_match('/[rn]/', $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 的换行统一转成 "rn"(无论源系统),但 PHP 接收后,$_POST 或 $_REQUEST 中的值已解码,"rn" 就是字面量。
容易踩的坑:
- 用了
addslashes()或 magic quotes(已废弃但遗留代码可能有)→"n"变成"\n",检测失效 - 前端 js 用
.replace(/n/g, '
')渲染,但没改提交值 → 不影响后端检测
- 用户粘贴内容带 Unicode 换行符(如 U+2028、U+2029)→
strpos()查不到,需额外正则:preg_match('/[rnxE2x80xA8xE2x80xA9]/u', $s)
U+2028/U+2029 极少见,除非用户从某些编辑器或 json 直接粘贴,普通 textarea 不会产生。日常检测 "r" 和 "n" 足够。