skip to Main Content

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

Answers


  1. 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*)+)$/', "nn$1", $text);
    
    Login or Signup to reply.
  2. 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', "nn",  $text, 1);
    

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

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

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

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search