ごめん自己解決した。
phpでやってるんですが、

$text = eregi_replace(
"(http://[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]?)".
"[-_\.!~*'()a-zA-Z0-9;/\?:@&=+$,%#]*",
'<a href="\0">\1</a>', $text);

こんな感じのでできました。
果てしなくコードきもいけど。
もっとスマートな方法あるんでしょうか。