RE: Need help with RegEx

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



preg_match_all('|<status>([^<]*)</status>|msU', $xml, $matches);
var_dump($matches);

YMMV

Download and play with "The Regex Coach"

On Mon, December 11, 2006 9:29 am, Brad Fuller wrote:
>
> The example provided didn't work for me.  It gave me the same string
> without
> anything modified.
>
> I am also looking for this solution to strip out text from some XML
> response
> I get from posting data to a remote server.  I can do it using
> substring
> functions but I'd like something more compact and portable. (A
> one-liner
> that I could modify for other uses as well)
>
> Example 1:
> <someXMLtags>
> 	<status>16664 Rejected: Invalid LTV</status>
> </someXMLtags>
>
> Example 2:
> <someXMLtags>
> 	<status>Unable to Post, Invalid Information</status>
> </someXMLtags>
>
> I want what is inside the <status> tags.
>
> Does anyone have a working solution how we can get the text from
> inside
> these tags using regex?
>
> Much appreciated,
>
> B
>
>> -----Original Message-----
>> From: Michael [mailto:michael@xxxxxxxxxxxxxx]
>> Sent: Monday, December 11, 2006 6:59 AM
>> To: Anthony Papillion
>> Cc: php-general@xxxxxxxxxxxxx
>> Subject: Re:  Need help with RegEx
>>
>> At 01:02 AM 12/11/2006 , Anthony Papillion wrote:
>> >Hello Everyone,
>> >
>> >I am having a bit of problems wrapping my head around regular
>> expressions. I
>> >thought I had a good grip on them but, for some reason, the
>> expression
>> I've
>> >created below simply doesn't work! Basically, I need to retreive
>> all of
>> the
>> >text between two unique and specific tags but I don't need the tag
>> text.
>> So
>> >let's say that the tag is
>> >
>> ><tag lang='ttt'>THIS IS A TEST</tag>
>> >
>> >I would need to retreive THIS IS A TEST only and nothing else.
>> >
>> >Now, a bit more information: I am using cURL to retreive the entire
>> contents
>> >of a webpage into a variable. I am then trying to perform the
>> following
>> >regular expression on the retreived text:
>> >
>> >$trans_text = preg_match("\/<div id=result_box
>> dir=ltr>(.+?)<\/div>/");
>>
>> 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);
>>
>> how this breaks down is:
>>
>> opening quote for first parameter (your MATCH pattern).
>>
>> open regex match pattern= /
>>
>> first atom (.*?) = any or no leading text before <div id=result_box
>> dir=ltr>,
>> the ? makes it non-greedy so that it stops after finding the first
>> match.
>>
>> second atom (<div id=result_box dir=ltr>) = the opening tag you are
>> looking for.
>>
>> third atom (.*?) = the text you want to strip out, all text even if
>> nothing is
>> there, between the 2nd and
>> 4th atoms.
>>
>> fourth atom (<\/div>) = the closing tag of the div tag pair.
>>
>> fifth atom (.*?) = all of the rest of the source html after the
>> closing
>> tag up
>> to the end of the line ^,even if there is nothing there.
>>
>> close regex match pattern= /s
>>
>> in order for this to work on html that may contain newlines, you
>> must
>> specify
>> that the . can represent newline characters, this is done by adding
>> the
>> letter
>> 's' after your regex closing /, so the last thing in your regex
>> match
>> pattern
>> would be /s.
>>
>> end of string ^ (this matches the end of the string you are
>> matching/replacing
>> , $source_html)
>>
>> closing quote for first parameter.
>>
>> The second parameter of the preg_replace is the atom # which
>> contains the
>> text
>> you want to replace the text matched by the regex match pattern in
>> the
>> first
>> parameter, in this case the text we want is in the third atom so
>> this
>> parameter
>> would be $3 (this is the PHP way of back-referencing, if we wanted
>> the
>> text
>> before the tag we would use atom 1, or $1, if we want the tag itself
>> we
>> use $2,
>> etc basically a $ followed by the atom # that holds what we want to
>> replace the
>> $source_html into $trans_text).
>>
>> The third parameter of the preg_replace is the source you wish to
>> match
>> and
>> replace from, in this case your source html in $source_html.
>>
>> after this executes, $trans_text should contain the innerText of the
>> <div
>> id=result_box dir=ltr></div> tag pair from $source_html, if there is
>> nothing
>> between the opening and closing tags, $trans_text will == "", if
>> there is
>> only
>> a newline between the tags, $trans_text will == "\n". IMPORTANT: if
>> the
>> text
>> between the tags contains a newline, $trans_text will also contain
>> that
>> newline
>> character because we told . to match newlines.
>>
>> I am no regex expert by far, but this worked for me (assuming I
>> copied it
>> correctly here heh)
>> There are doubtless many other ways to do this, and I am sure others
>> on
>> the
>> list here will correct me if my way is wrong or inefficient.
>>
>> I hope this works for you and that I haven't horribly embarassed
>> myself
>> here.
>> Good luck :)
>>
>> >
>> >The problem is that when I echo the value of $trans_text variable,
>> I end
>> up
>> >with the entire HTML of the page.
>> >
>> >Can anyone clue me in to what I am doing wrong?
>> >
>> >Thanks,
>> >Anthony
>> >
>> >--
>> >PHP General Mailing List (http://www.php.net/)
>> >To unsubscribe, visit: http://www.php.net/unsub.php
>> >
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>


-- 
Some people have a "gift" link here.
Know what I want?
I want you to buy a CD from some starving artist.
http://cdbaby.com/browse/from/lynch
Yeah, I get a buck. So?

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


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux