RE: [PHP] Need help with RegEx

From: Date: Tue, 12 Dec 2006 13:18:24 +0000
Subject: RE: [PHP] Need help with RegEx
References: 1  Groups: php.general 
Request: Send a blank email to php-general+get-245743@lists.php.net to get a copy of this message
At 04:56 AM 12/12/2006 , Ford, Mike wrote: >On 11 December 2006 19:43, Michael wrote: > >> At 08:29 AM 12/11/2006 , Brad Fuller wrote: >> > >> > The example provided didn't work for me. It gave me the same >> > string without anything modified. >> >> You are absolutely correct, this is what I get for not >> testing it explicitly :( My most sincere apologies to the OP >> and the list, there is an error in my example (see below for >> correction) >> >> **** I have cut and pasted from further down in the quoted >> message, for convenience **** >> > > Using the tags you describe here, and assuming the source html is >> > > in the variable $source_html, try this: >> > > >> > > $trans_text = preg_replace("/(.*?)(<div id=result_box >> > > dir=ltr>)(.*?)(<\/div>)(.*?)^/s","$3",$source_html); >> >> The End of string symbol ^ should not be included. > >That's because ^ is not the end-of-string symbol -- it's the START-of-string symbol. >$ is the END-of string symbol. But the OP doesn't need either of these symbols as he's >not trying to match at the start or end of the string, and nor does he need your suggested leading >and trailing (.*?) for the same reason. Unless anchored with ^ and/or $, preg is perfectly happy to >match in the middle of the subject string. Well, DOH, leave it to me to bugger something up like that heh, got the $ and ^ reversed. Thanks for correcting me :) > >@Anthony: your pattern is fine -- it's what you're doing with it that's wrong. > >On 11 December 2006 08:03, Anthony Papillion wrote: > >> $trans_text = preg_match("\/<div id=result_box >> dir=ltr>(.+?)<\/div>/"); >> >> The problem is that when I echo the value of $trans_text variable, I >> end up with the entire HTML of the page. > >I don't see how this is possible, since preg_match returns an integer telling you how many >times the pattern matched -- which will be 0 or 1, since preg_match doesn't do multiple >matches! You also clearly haven't given us your actual call, since you've only included >the pattern and not the subject string. > >What you're after is the third argument to preg_match, which returns an array of matched >text; so for: > > preg_match("/<div id=result_box> dir=ltr>(.+?)<\\/div>/", $orig, > $matches); > >$matches[0] will return the entire match (everything from "<div " to >"</div>" >$matches[1] will return the first parenthesized expression, which is what you're looking >for. > >Note also the doubled backslash, since you need to pass a single backslash through to escape the >/ for preg_match. As an alternative, I would strongly advise using a different delimiter, so that >no escaping is needed; for instance: > > preg_match("#<div id=result_box> dir=ltr>(.+?)</div>#", $orig, > $matches); > >Cheers! > >Mike > >--------------------------------------------------------------------- >Mike Ford, Electronic Information Services Adviser, >Learning Support Services, Learning & Information Services, >JG125, James Graham Building, Leeds Metropolitan University, >Headingley Campus, LEEDS, LS6 3QS, United Kingdom >Email: m.ford@leedsmet.ac.uk >Tel: +44 113 283 2600 extn 4730 Fax: +44 113 283 3211 > > >To view the terms under which this email is distributed, please go to >http://disclaimer.leedsmet.ac.uk/email.htm > >-- >PHP General Mailing List (http://www.php.net/) >To unsubscribe, visit: http://www.php.net/unsub.php >

« previous php.general (#245743) next »