Regexp help - substring of a backreference

I’m putting together a web forum and want to parse web addresses that
are part of messages into clickable links. This is my attempt, I’m not
claiming its perfect but it works:

text.gsub!(/http:?/*(\w+[\w-./~?%&=#;,+:@]+)/,
http://\1’)

The problem is that some web addresses are incredibly long, so I want
the link text to be limited to, say, 50 chars. i.e. the second \1 needs
to be \1[0…49] or something. I can’t figure out any easy way of doing
it, any ideas?

On 7 August 2010 15:33, Bryan K. [email protected] wrote:

it, any ideas?

Posted via http://www.ruby-forum.com/.

$ ri gsub!

Implementation from String

str.gsub!(pattern, replacement) → str or nil
str.gsub!(pattern) {|match| block } → str or nil
str.gsub!(pattern) → an_enumerator


Performs the substitutions of String#gsub in place, returning
str, or nil if no substitutions were performed. If no block and
no replacement is given, an enumerator is returned instead.

text.gsub(/http:?/*(\w+[\w-./~?%&=#;,+:@]+)/) { %Q{http://#{$1[0…50]}} }
=> “<a href="http://\u0001"
target="_blank">http://mydgfsjceeeefknuxqbkqkhdslkjdhxfilunhefilxqhleiufn

I am using %Q{str}, as “str” because you already have quotes. You
should also use %r{regex} for you Regexp, as it contains ‘/’.

Benoit D.

On 7 August 2010 16:02:31 UTC+2, Benoit D. [email protected]
wrote:

to be \1[0…49] or something. I can’t figure out any easy way of doing
str.gsub!(pattern, replacement) → str or nil
text.gsub(/http:?/*(\w+[\w-./~?%&=#;,+:@]+)/) { %Q{http://#{$1[0…50]}} }

I am using %Q{str}, as “str” because you already have quotes. You should also use %r{regex} for you Regexp, as it contains ‘/’.

Benoit D.

Missed the first ‘\1’ :
text.gsub(/http:?/*(\w+[\w-./~?%&=#;,+:@]+)/) {|match| %Q{http://#{$1[0…50]}} }

Benoit D. wrote:

text.gsub(/http:?/*(\w+[\w-./~?%&=#;,+:@]+)/) {|match| %Q{http://#{$1[0…50]}} }

Thanks, works a charm :slight_smile:

Hi –

On Sat, 7 Aug 2010, Bryan K. wrote:

it, any ideas?
You can use the block form, plus the thread-local $ variables:

text = “a bunch of miscellaneous words”
text.gsub!(/a b(.+)/) { $1[0,10] }
puts text # unch of mi

David


David A. Black, Senior Developer, Cyrus Innovation Inc.

The Ruby training with Black/Brown/McAnally
Compleat Philadelphia, PA, October 1-2, 2010
Rubyist http://www.compleatrubyist.com