$re = '/(?:is listening to|is watching|is playing|is editing) \[https?://osu.ppy.sh(/beatmapsets/(\d+)(#([a-z]+)?/?(\d+))?|/(b|s)/(\d+)).*\]((?: (?:-Easy|-NoFail|-HalfTime|\+HardRock|\+SuddenDeath|\+Perfect|\+DoubleTime|\+Nightcore|\+Hidden|\+Flashlight|~Relax~|~AutoPilot~|-SpunOut|\|Autoplay\|))*)/m';
$str = '* ekgame is listening to [https://osu.ppy.sh/beatmapsets/1989906#osu/4133938 TUYU - Ame o Abiru]
* ekgame is listening to [https://osu.ppy.sh/beatmapsets/1989906#fruits/4139282 TUYU - Ame o Abiru]
* ekgame is listening to [https://osu.ppy.sh/beatmapsets/1989906#osu/4133938 TUYU - Ame o Abiru] +HardRock ~Relax~
* ekgame is listening to [https://osu.ppy.sh/b/4133938 TUYU - Ame o Abiru]
* ekgame is listening to [https://osu.ppy.sh/s/1989906 TUYU - Ame o Abiru]
';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php