Extraordinarily helpful; thank you very much!  Thanks to both Mike and Kevin
on this.

Jen

> > > Why does this work:
> > >
> > > $contents =
> > >
> > eregi_replace("(\")(.(/))*[A-Z0-9_/-]+(.gif|.jpg)",
> > > "\"blah.gif", $contents);
> > >
> > > But this does not:
> > >
> > >
> > preg_match_all("(\")(.(/))*[A-Z0-9_/-]+(.gif|.jpg)",
> > > $contents, $matches);
> > >
> > > for ($i=0; $i< count($matches[0]); $i++) {
> > > echo "matched: ".$matches[0][$i]."\n"
> > > }
> > >
> > > I get this error:
> > >
> > > Warning: Unknown modifier '(' in
> > > /home/littleduck/www/www/newcontrol/temp/fread.php
> > on
> > > line 20
> >
> > Well, first of all you've switched from a
> > POSIX-extended regular expression
> > function, eregi_replace(), to a Perl-compatible
> > regular expression (PCRE)
> > function, preg_match_all() -- all the POSIX-extended
> > function names begin
> > with an e, and all the PCRE ones with a p.  The
> > rules are different for the
> > two sets, and one of the most important ones is that
> > the PCRE functions
> > require the pattern to be enclosed within
> > delimiters, and the POSIX-extended
> > ones don't (this is because you can add optional
> > _modifiers_ after the
> > ending delimiter for PCRE matching).  The syntax of
> > the regular expressions
> > is also slightly different, and a pattern that works
> > reliably for PCRE won't
> > necessarily for POSIX-extended, and vice versa --
> > especially as PCRE is far
> > more versatile and feature-rich.
> >
> > So, your basic problem in the preg_match_all() is
> > that you haven't *added*
> > delimiters -- the requirement is that you must use
> > the same character both
> > before and after your pattern, or a matched pair
> > from one of the sets (),
> > {}, [], and <>. So, the pattern parser is seeing the
> > initial "(" in your
> > expression, treating it as the opening delimiter,
> > and taking your basic
> > pattern to be the text up to the matching ")" --
> > that is, just (\").  It
> > then looks to see if the next character is a valid
> > _modifier_ (remember
> > them?), finds "(" which isn't one, and complains --
> > and bingo!, there's your
> > "Unknown modifier '('" message.
> >
> > So, this, for example, would work:
> >
> >
> >
> preg_match_all("{(\")(.(/))*[A-Z0-9_/-]+(.gif|.jpg)}",
> > $contents,
> > $matches);
> >
> > although I'd point out that "." is a
> > pattern-matching element that means
> > "any character", so you might prefer to escape it --
> > unfortunately, both
> > regular expressions and PHP's double-quoted strings
> > use \ as their escape
> > character, so to get a single backslash into the
> > expression to escape the
> > ".", you've got to use two \\s (and to match an
> > actual single backslash, you
> > have to write no less than *four* backslashes!).  So
> > this would give:
> >
> >
> >
> preg_match_all("{(\")(\\.(/))*[A-Z0-9_/-]+(\\.gif|\\.jpg)}',
> > $contents,
> > $matches);
> >
> > Because of the problems with "backslash breeding"
> > that this can cause, I'd
> > always recommend using single-quoted strings for
> > your patterns -- especially
> > as, in this case, you have a double-quote in the
> > pattern!  Thus, my final
> > effort would be:
> >
> >
> >
> preg_match_all('{(")(\.(/))*[A-Z0-9_/-]+(\.gif|\.jpg)}',
> > $contents,
> > $matches);
> >
> > Lastly, you may care to search the archives of this
> > list for postings about
> > the relative efficiency of the two types of
> > expressions -- I know one set is
> > frequently recommended as more efficient than the
> > other, but can never
> > remember which!
> >
> > Hope this is helpful,
> >
> > Cheers!
> >
> > Mike



-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to