Note: @alex's answer is the way to go. Validating a number range with regex is like using a jackhammer to catch a fly.
But nevertheless I wanted to provide an explanation for this "problem".
You don't have to, you just have to group it correctly, which means you have to group the alternation:
'/^(([0-1]?[0-9]?[0-9])|([2][0-4][0-9])|(25[0-5]))$/'
// ^ ^
Otherwise the expression will be interpreted as follows (logically)
(^number) OR (number) OR (number$)
With the brackets, it will be
^(number OR number OR number)$
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…