on 2003-10-10 James Edward Gray II said:

>Keep your replies on the list, so you can get help from all the people 
>smarter than me.  ;)

If there are people smarter than you out there I must be an amoeba ;)

>Okay, why put this inside an if block.  If it doesn't find a match it 
>will fail and do nothing, which is what you want, right?  I don't think 
>you need the if.

Good point.

>Why don't we work on your Regular Expression a little and see if we can 
>do it all in one move.  We want to find all occurrences of the keyword, 
>as long as they're not on a line beginning with qz, right?  This seems 
>to do that for me:
>
>$content =~ s/^([^\n]*)($kw)/substr($1, 0, 2) ne 'qz' ? "$1\n$2\n" : 
>"$1$2"/mge;
>

Ok. I had to stop to pick myself up off the floor then. WOW.

This has actually made it possible to cut the whole thing down massively.

here's the code now:

_________________________ 
# get line breaks to make <br>'s at the end
$content =~ s/\n/-qbr-/g;

# find markup and add markers so it doesn't get processed by regex, 
# no keyword links to be made inside other tags
$content =~ s/(\[(img|page|link|mp3)=.*?\])/\nqz$1\n/g;

# find HTML so it doesn't get processed by regex, 
# no keyword links to be made inside valid HTML
$content =~ s/(<.*?>)/\nqz$1\n/g;

for my $href ( @Keywords ) {
    
    # get each keyword and llok for it in content.
    for $kw ( keys %$href ) {
        if ($content =~ /\b($kw)\b/g) {
            
            # do the very clever reg with help from and thanks to           
            # [EMAIL PROTECTED]
            $content =~ s/^([^\n]*)($kw)/substr($1, 0, 2) ne 'qz' ?
"$1\nqz[link=\"$href->{$kw}\" title=\"$2\"]\n" : "$1$2"/mge;
        }
    }
}

# clean up those line breaks and markers;
$content =~ s/\n(qz)?//g;

# put in <br>'s
$content =~ s/-qbr-/<br>\n/g;

print $content;
_________________________

As you can see I've adapted your regex a little to put in the full markup around
the keyword.

The regex itself made perfect sense, it was the 

"" ? "" : "" bit that I've never seen before. That's really useful.

I assume it means

"if statement" ? "do if true" : "do if false"

Please do correct me if I'm wrong. What do you call that? I think I'm going it
be using that quite a bit ;)

do I even need the if false bit in this case?

>I used the /e modifier for the replacement, which allows me to use Perl 
>code in there.  It's pretty simple.  If the line didn't start with a 
>qz, we do a normal replace.  

That's going in my BBEdit gold dust code snippets glossary.

>Let me know if that will work for you.

It did, perfectly. Thank you soooooo much,

>Your right about it being inefficient, of course.  It was easier to 
>read than my Regex though, eh?  <laughs>  

Are you implying that regex isn't easy to read ;)

>The first choice may be slow, 
>but on modern computers they may both work in the blink of an eye.  
>Save worrying about speed for when you need to and try and keep your 
>life as a programmer as easy as possible until then.

Sadly then is now. That's why I joined up to this list today ;)

This code will be run on every single page of a website, in one go. So it needs
to be as efficient as physically possible. The site will only be a few hundred
pages, and not all pages will always be processed. It's a system that makes it's
own links and maintains them, so eveytime a page's keywords change this has to
be done to all pages that contain that keyword.

I know this is not a task for the beginner, but this is actually version 3 of
the code. my old programming language started to show it's dislike for regex.

>> If you have any suggestions I would be most grateful to hear them.
>
>Those are my best shots.  Hope they help.

They did, thank you so much.

Angie

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to