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

73 Views Asked by At

I've already tried a couple of regex but cannot fix this one:

I need an enter line before the hashtags start (so there is some space).

Example:

It's essential to keep your pup cool in the summer months! Try to keep them out of the heat as much as possible - keep the house cool, provide shade and run a fan for them if you can. #Dogs #Animals #Summer #DogCare #Humidity #HeatStroke #Cooling #HeatExhaustion #StayCool #HealthyPups

Should be:

It's essential to keep your pup cool in the summer months! Try to keep them out of the heat as much as possible - keep the house cool, provide shade and run a fan for them if you can.

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

If there is a hashtag in the text it should not add whitespace, for example (note hashtags in text!):

It's essential to keep your pup cool in the summer months! Try to keep them out of the heat as much as #possible - keep the house cool, #provide shade and run a #fan for them if #you can. #Dogs #Animals #Summer #DogCare #Humidity #HeatStroke #Cooling #HeatExhaustion #StayCool #HealthyPups

How can I solve this with Regex and PHP?

2

There are 2 best solutions below

0
Barmar On BEST ANSWER

You can match a series of hashtags with the regexp:

(?:#\w+\s*)+$
  • #\w+ matches a single hashtag
  • \s* matches the optional whitespace between the hashtags
  • + after the group matches a sequence of at least one of these
  • $ matches the end of the input string.

You can then use preg_replace() to insert a blank line before this.

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

Match a space which is followed by one or more sequences of hashtags until the end of the string. Inform preg_replace() to make only 1 replacement by adding 1 as the fourth parameter.

Code: (Demo)

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

Or without a lookahead or a replacement limit: (Demo)

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

Both approaches will cleanly replace the space before the sequence of hashtags with the two newlines.