Verdel
В PCRE нет численного сравнения как такового, можно только баловаться с записью числа, но мне кажется в данном случае это не нужно. Почему бы не проверять $1 внутри callback-функции (если ты делаешь замену)? А выделять можно шаблоном '~\[size=(\d+)](.*)\[/size\]~i'.
Если я тебя не убедил, то:
~\[size=([0-3]?[0-9]|40)\](.*)\[/size\]~i'
White Rabbit
> #\[size(?:=)([0-3]?[0-9])\](.*)\[/size\]#i
В задаче сказано "не превосходил например 40", т.е. $1 <= 40. Такой вариант захватывает только от 0 до 39.