in reply to Problems with regex grouping

Hello

The regexp you want is:

my @ar = (); # empty array while(<>){ #for every match in the line #(if there are more than one email in a line) while(/<a href="(mailto:)?([^"]*)">([^<]*)<\/a>/g){ push @ar, "$3\t$2"; } } open ... for(sort @ar){ my ($name, $email) = split/\t/; print OUT qq(<a href="mailto:$email">$name</a><br />\n); }

Update: If you have only one link perl line, you can do this:

while(<>){ if(/<a href="(mailto:)?([^"]*)">([^<]*)<\/a>/){ push @ar, "$3\t$2"; } else { warn "Err: $_\n"; } }

Hope this helps,,,

Aziz,,,

Replies are listed 'Best First'.
Re: Re: Problems with regex grouping
by damian1301 (Curate) on Aug 17, 2001 at 21:59 UTC
    To avoid throwing stuff in $1 when you don't need to, there is a great feature called clustering in REs with the (?:stuff here) stuff :). Just change
    /<a href="(mailto:)?([^"]*)">([^<"]*)<\/a>/g
    to

    /<a href="(?:mailto:)?([^"]*)">([^<"]*)<\/a>/g

    And that way nothing will be put in $1.

    You may also want to consider chomping  $2 and $3 because a newline could get in there somewhere and cause some trouble.

    Hope I helped out. :):):) Later

    $_.=($=+(6<<1));print(chr(my$a=$_));$^H=$_+$_;$_=$^H; print chr($_-39); # Easy but its ok.