最简单安全的首段截取是先strip_tags()去html,再按换行或标签分割提取;中文须用mb_*函数;html输出前必须htmlspecialchars()二次转义。

用 mb_substr() 截首段最简单,但得先找段落边界
直接用 mb_substr() 取前 200 字容易在 HTML 标签中间截断,导致页面错乱或 XSS 风险。真实场景里,用户发的是带格式的富文本(比如从编辑器粘贴的),第一段后面往往跟着 <p></p>、<br> 或换行符。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 先用
strip_tags()去掉 HTML,再用preg_split()按\n或\r\n分割,取第一个非空元素 - 如果原文没换行但有
<p></p>,可用preg_match('/<p>(.*?)/is', $html, $m)</p>提取首段内容 - 别依赖
strlen()—— 中文要用mb_strlen(),否则一个汉字算 3 字节,截出来全是乱码
关键词提取靠 preg_match_all() + 词频统计,不是正则一搜就完事
想按“PHP”“摘要”“截取”这类词生成摘要?光用 strpos() 找关键词位置远远不够:词可能被标点包着、大小写不一致、或在 HTML 属性里误匹配。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 先
strip_tags(),再转小写,用preg_match_all('/[a-z\u4e00-\u9fa5]+/u', $text, $words)提取纯词 - 过滤停用词(如“的”“是”“和”),对剩余词做频次统计,选前 3–5 个高频词
- 注意:中文分词不能只靠正则,简单场景够用;真要准,得上
jieba-php这类扩展,但部署成本高、响应慢
mb_strimwidth() 适合标题类短文本,长正文慎用
mb_strimwidth() 看起来省事:自动加省略号、支持多字节。但它不识别语义,可能把“数据库连接失败”截成“数据库连…”,丢失关键信息。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 只用于固定长度展示场景,比如列表页的标题摘要(
mb_strimwidth($title, 0, 30, '…', 'UTF-8')) - 正文摘要必须结合语义切分——优先在句号、问号、换行后截断,而不是硬性字数限制
- 传入的
$encoding参数必须显式写'UTF-8',PHP 7.4+ 默认不再猜编码,漏写会返回空字符串
HTML 摘要输出前必须二次 htmlspecialchars()
很多人把清洗后的文本直接 echo 出来,结果用户输入了 <script>alert(1)</script>,或者带双引号的属性值,导致前端 JS 报错或 XSS。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 即使你用了
strip_tags(),也要再过一遍htmlspecialchars($cleaned, ENT_QUOTES, 'UTF-8') - 特别注意:如果摘要要放进 HTML 属性(比如
title="{$summary}"),必须用ENT_QUOTES,否则双引号不转义 - 别信“我只取纯文本所以安全”——用户可能粘贴含 Unicode 控制字符的文本,
htmlspecialchars()能兜底处理
真正难的不是截几个字,而是判断哪里该停:是句末?标签闭合后?还是关键词出现三次之后?这些逻辑没法靠一个函数解决,得根据你的内容结构定规则。没统一方案,只有具体场景具体拆。











