You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Regex和PHP实现文本与末尾Hashtags的换行分隔?

解决方案:用正则表达式在末尾话题标签前插入换行

核心思路

区分文本中间嵌入的话题标签和段落末尾连续的话题标签,通过正则断言定位「最后一段非标签文本结尾」与「第一个末尾话题标签开头」的间隙,在该位置插入换行,确保不影响中间的标签。

正则表达式与PHP实现

使用preg_replace结合正则断言完成需求:

// 示例输入文本
$originalText = "我喜欢#编程 也喜欢#设计 #技术分享 #学习";

// 匹配末尾标签组的正则规则
$pattern = '/(?<!#)(?=[\t ]+(#\S+)(?:[\t ]+#\S+)*$)/';

// 执行替换,插入换行
$processedText = preg_replace($pattern, "\n", $originalText);

// 输出处理后的内容
echo $processedText;

正则规则详解

  • (?<!#):负向后行断言,确保匹配位置的前一个字符不是#,避免误匹配文本中间的标签(比如#编程这类嵌入句子的标签)。
  • (?=[\t ]+(#\S+)(?:[\t ]+#\S+)*$):正向前瞻断言,匹配满足以下条件的后续内容:
    • 以一个或多个空格/制表符开头
    • 跟着至少一个#开头的话题标签(#\S+表示#后接非空白字符)
    • 后续可以有多个空格分隔的话题标签,直到字符串结尾

效果示例

  1. 原文本(末尾带连续标签):

今天天气真好 #晴天 #好心情

处理后:

今天天气真好
#晴天 #好心情

  1. 原文本(中间含标签,末尾带连续标签):

我喜欢#编程 也喜欢#设计 #技术分享 #学习

处理后:

我喜欢#编程 也喜欢#设计
#技术分享 #学习

边界情况说明

  • 若文本已将标签单独分段(已有换行),正则不会重复添加换行(断言仅匹配空格/制表符,不匹配换行)。
  • 若文本全是话题标签(无前置文本),不会插入换行,符合预期。
  • 要求末尾标签前必须有空格分隔,这符合日常话题标签的使用习惯;若需支持标签前无空格的场景,可调整正则中的[\t ]+为[\t ]*,但这类场景较少见。

内容的提问来源于stack exchange,提问作者Jamie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:35:14