添加换行符以分隔文本,并仅添加出现在字符串末尾的主题标签

Add newlines to separate text and only hashtags that appear at the end of the string

提问人:Jamie 提问时间:6/1/2023 最后编辑:mickmackusaJamie 更新时间:6/1/2023 访问量:61

问:

我已经尝试了几个正则表达式,但无法修复这个问题:

在主题标签开始之前,我需要一个输入行(所以有一些空间)。

例:

在夏季保持幼犬凉爽至关重要!尽量保持 他们尽可能地远离高温 - 保持房子凉爽, 如果可以的话,为他们提供阴凉处并运行风扇。#Dogs #Animals #Summer #DogCare #Humidity #HeatStroke #Cooling #HeatExhaustion #StayCool #HealthyPups

应该是:

在夏季保持幼犬凉爽至关重要!尽量保持 他们尽可能地远离高温 - 保持房子凉爽, 如果可以的话,为他们提供阴凉处并运行风扇。

#Dogs #Animals #Summer #DogCare #Humidity #HeatStroke #Cooling #HeatExhaustion #StayCool #HealthyPups

如果文本中有主题标签,则不应添加空格,例如(注意文本中的主题标签!

在夏季保持幼犬凉爽至关重要!尽量保持 它们尽可能远离热量 #possible - 保持房子凉爽, 如果可以的话,#provide 遮荫并为他们 #you #fan。#Dogs #Animals #Summer #DogCare #Humidity #HeatStroke #Cooling #HeatExhaustion #StayCool #HealthyPups

如何使用正则表达式和PHP解决这个问题?

php regex preg-replace limit 标签

评论

0赞 Chris Haas 6/1/2023
所以如果我说“我喜欢披萨!#pizza #pepperoni #PizzaPizza 我有没有提到我喜欢披萨?“——不应该休息,因为最后还有其他非哈希的东西?
0赞 Barmar 6/1/2023
这两种情况的客观区别是什么?主题标签始终“在文本中”。
0赞 Jamie 6/1/2023
是的,正确!克里斯
0赞 Jamie 6/1/2023
只有末尾的主题标签组之间应该有空格。
0赞 Barmar 6/1/2023
因此,如果文本以一系列主题标签结尾,您希望在第一个标签之前使用换行符吗?

答:

2赞 Barmar 6/1/2023 #1

您可以将一系列主题标签与正则表达式匹配:

(?:#\w+\s*)+$
  • #\w+匹配单个主题标签
  • \s*匹配主题标签之间的可选空格
  • +在组匹配以下至少一个序列之后
  • $匹配输入字符串的末尾。

然后,您可以使用在此之前插入一个空行。preg_replace()

$text = preg_replace('/((?:#\w+\s*)+)$/', "\n\n$1", $text);
1赞 mickmackusa 6/1/2023 #2

匹配一个空格,后跟一个或多个主题标签序列,直到字符串末尾。通知通过添加作为第四个参数来仅进行 1 次替换。preg_replace()1

代码:(演示)

echo preg_replace('/ (?=(?:#[a-z]+\s*)+$)/i', "\n\n",  $text, 1);

或者没有前瞻或替换限制:(演示)

echo preg_replace('/ ((?:#[a-z]+\s*)+)$/i', "\n\n$1",  $text);

这两种方法都将用两个换行符干净地替换主题标签序列之前的空格。