php 添加换行符以分隔文本,并且只添加出现在字符串末尾的井号标签

4xrmg8kj  于 2023-06-04  发布在  PHP
关注(0)|答案(2)|浏览(107)

我已经尝试了几个正则表达式,但无法修复这个:
我需要一个输入线之前的标签开始(所以有一些空间)。
示例:
在夏天的几个月里,让你的小狗保持凉爽是至关重要的!尽量让他们远离炎热-保持房子凉爽,提供阴凉处,如果可以的话,为他们运行风扇。#狗#动物#夏天#狗护理#湿度#中暑#冷却#热衰竭#保持凉爽#HealthyPups
应为:
在夏天的几个月里,让你的小狗保持凉爽是至关重要的!尽量让他们远离炎热-保持房子凉爽,提供阴凉处,如果可以的话,为他们运行风扇。

狗#动物#夏天#狗护理#湿度#中暑#冷却#热衰竭#保持凉爽#HealthyPups

例如,如果文本中有主题标签,则不应添加空格(注意文本中的主题标签!):
在夏天的几个月里,让你的小狗保持凉爽是至关重要的!尽可能让他们远离炎热-保持房子凉爽,如果可以的话,为他们提供阴凉和风扇。#狗#动物#夏天#狗护理#湿度#中暑#冷却#热衰竭#保持凉爽#HealthyPups
如何使用Regex和PHP解决这个问题?

qojgxg4l

qojgxg4l1#

您可以将一系列主题标签与regexp匹配:

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

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

$text = preg_replace('/((?:#\w+\s*)+)$/', "\n\n$1", $text);
oyt4ldly

oyt4ldly2#

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

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

或者没有前瞻或替换限制:(Demo

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

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

相关问题