in reply to Monks' Expression

How about:
my $str = '[id=4590]blahblah[/id]'; $str =~ m/^\[id=(\d+)\](.+)\[/; print '<a href="/cgi-bin/coolcode.pl?id=' . "$1>$2</a>\n";
or . . .
$str =~ s{^\[id=(\d+)\](.+)\[/id]}{<a href="/cgi-bin/coolcode.pl?id=$1 +>$2</a>}; print "$str\n";
I should mention that you probably will want to take out the carret ^ in both regex's - that tells the engine to start the match at the BEGINNING of the string. Since you are probably going to be extracting this from somewhere in the middle of the document - you don't want this.

Also, don't forget to add the 'g' modifier if you want to get multiple occurrences of the regex.

Update: Big thanks to kudra for reminding me to add $2 !!

Jeff

L-LL-L--L-LL-L--L-LL-L--
-R--R-RR-R--R-RR-R--R-RR
F--F--F--F--F--F--F--F--
(the triplet paradiddle)

Replies are listed 'Best First'.
Re: Re: Monks' Expression
by eg (Friar) on Jan 22, 2001 at 00:07 UTC

    Instead of trying to do everything with a single regular expression, consider breaking it up into two.

    $str =~ s/\[id=(\d+)\]/<a href='...$1'>/g; $str =~ s/\[\/id\]/<\/a>/g; print $str;

    This will deal more gracefully with links that span multiple lines (which often happens when people write in a auto-wrapping editor.)

Re: Re: Monks' Expression
by ColonelPanic (Friar) on Jan 22, 2001 at 04:20 UTC
    This regex won't work if you have more than one id tag. the reason is the greedy behavior of .+ This will get everything from the very first opening tag to the last closing tag.

    When's the last time you used duct tape on a duct? --Larry Wall