try with this pattern:
$desc = preg_replace('~\[url=[^]]*]\s*+\[/url]~i', '', $desc);
The idea is to avoid the lazy quantifier using a character class that doesn't contain the closing square bracket (ie: [^]]).
The \s*+ allows only white characters between the opening and the closing tags, but you can remove it if you don't need it.
Note that a closing square bracket don't need to be escaped outside a character class and must be escaped inside a character class unless it is the first character. You can write [^]a] or [^a\]] or [^\]a] but not [^a]] that is interpreted as all characters but a followed by ]
I am surprise by what you are trying to do since [url=www.example.com][/url] stands for [url=www.example.com]www.example.com[/url]