[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

string scan question

srinsriram

4/6/2007 4:52:00 PM

this is probably elementary but I just havent found the right/
reliable way to do this (that works always)

if a string has content in tags such as <TagName> content goes here </
TagName> whats the best way to put the content inside an array.. the
content can have whitespace chars (end of lines tabs etc) that should
be preserved in the array element. These tags are simple (no
properties).

I assume that the scan method is relevant but am having trouble
constructing a regex that works reliably.

8 Answers

Peter Szinek

4/6/2007 5:00:00 PM

0

srinsriram@gmail.com wrote:
> this is probably elementary but I just havent found the right/
> reliable way to do this (that works always)
>
> if a string has content in tags such as <TagName> content goes here </
> TagName> whats the best way to put the content inside an array.. the
> content can have whitespace chars (end of lines tabs etc) that should
> be preserved in the array element. These tags are simple (no
> properties).
>
> I assume that the scan method is relevant but am having trouble
> constructing a regex that works reliably.

try

html_file.scan(/<TagName>(.+?)</).flatten

This will put the text contents of all <TagName> tags into an array.

Cheers,
Peter

--
http://www.rubyra... :: Ruby and Web2.0 blog
http://s... :: Ruby web scraping framework
http://rubykitch... :: The indexed archive of all things Ruby

srinsriram

4/6/2007 5:08:00 PM

0

Here is a simple test case

s = <VariableValue>\nXXX\n</VariableValue>\n\n<VariableValue>
\n<Choice> Administrative Support - Supervisors<Choice>\n</
VariableValue>\n\n"

for the VariableValue tag, there should be 2 array elements \nXXX
\n AND \n<Choice> Administrative Support - Supervisors<Choice>\n

s.scan(/<VariableValue>(.+?)</).flatten returns an empty array



On Apr 6, 12:59 pm, Peter Szinek <p...@rubyrailways.com> wrote:
> srinsri...@gmail.com wrote:
> > this is probably elementary but I just havent found the right/
> > reliable way to do this (that works always)
>
> > if a string has content in tags such as <TagName> content goes here </
> > TagName> whats the best way to put the content inside an array.. the
> > content can have whitespace chars (end of lines tabs etc) that should
> > be preserved in the array element. These tags are simple (no
> > properties).
>
> > I assume that the scan method is relevant but am having trouble
> > constructing a regex that works reliably.
>
> try
>
> html_file.scan(/<TagName>(.+?)</).flatten
>
> This will put the text contents of all <TagName> tags into an array.
>
> Cheers,
> Peter
>
> --http://www.rubyra...:: Ruby and Web2.0 bloghttp://s...:: Ruby web scraping frameworkhttp://rubykitch...:: The indexed archive of all things Ruby


Peter Szinek

4/6/2007 5:27:00 PM

0

srinsriram@gmail.com wrote:
> Here is a simple test case
>
> s = <VariableValue>\nXXX\n</VariableValue>\n\n<VariableValue>
> \n<Choice> Administrative Support - Supervisors<Choice>\n</
> VariableValue>\n\n"
>
> for the VariableValue tag, there should be 2 array elements \nXXX
> \n AND \n<Choice> Administrative Support - Supervisors<Choice>\n
>
> s.scan(/<VariableValue>(.+?)</).flatten returns an empty array

Ah OK, I did not know there can be other tags inside. This works better:

s.scan(/<VariableValue>(.+?)<\/VariableValue>/m).flatten

(note the 'm' flag for multiline)

however, to really match your example, I needed this:

s.scan(/<VariableValue>(.+?)<\/\n?VariableValue>/m).flatten

are you sure there is a line break between / and the tag name?

Cheers,
Peter

--
http://www.rubyra... :: Ruby and Web2.0 blog
http://s... :: Ruby web scraping framework
http://rubykitch... :: The indexed archive of all things Ruby

Alex Young

4/6/2007 5:31:00 PM

0

srinsriram@gmail.com wrote:
> Here is a simple test case
>
> s = <VariableValue>\nXXX\n</VariableValue>\n\n<VariableValue>
> \n<Choice> Administrative Support - Supervisors<Choice>\n</
> VariableValue>\n\n"
If it's actually XML, just use REXML. Anything else is asking for
trouble, really.

--
Alex

srinsriram

4/6/2007 5:34:00 PM

0

No there isnt any (due to wrapping here)..
I didnt know about the multiline option (seem to have missed that in
the docs). that worked

thanks very much

On Apr 6, 1:27 pm, Peter Szinek <p...@rubyrailways.com> wrote:
> srinsri...@gmail.com wrote:
> > Here is a simple test case
>
> > s = <VariableValue>\nXXX\n</VariableValue>\n\n<VariableValue>
> > \n<Choice> Administrative Support - Supervisors<Choice>\n</
> > VariableValue>\n\n"
>
> > for the VariableValue tag, there should be 2 array elements \nXXX
> > \n AND \n<Choice> Administrative Support - Supervisors<Choice>\n
>
> > s.scan(/<VariableValue>(.+?)</).flatten returns an empty array
>
> Ah OK, I did not know there can be other tags inside. This works better:
>
> s.scan(/<VariableValue>(.+?)<\/VariableValue>/m).flatten
>
> (note the 'm' flag for multiline)
>
> however, to really match your example, I needed this:
>
> s.scan(/<VariableValue>(.+?)<\/\n?VariableValue>/m).flatten
>
> are you sure there is a line break between / and the tag name?
>
> Cheers,
> Peter
>
> --http://www.rubyra...:: Ruby and Web2.0 bloghttp://s...:: Ruby web scraping frameworkhttp://rubykitch...:: The indexed archive of all things Ruby


Alex Young

4/6/2007 5:43:00 PM

0

Alex Young wrote:
> srinsriram@gmail.com wrote:
>> Here is a simple test case
>>
>> s = <VariableValue>\nXXX\n</VariableValue>\n\n<VariableValue>
>> \n<Choice> Administrative Support - Supervisors<Choice>\n</
>> VariableValue>\n\n"
> If it's actually XML, just use REXML. Anything else is asking for
> trouble, really.
Sorry, I didn't notice that your <Choice> tags aren't matched. Is that
intentional? If so, ignore my suggestion - REXML clearly won't work.

--
Alex

srinsriram

4/6/2007 5:57:00 PM

0

On Apr 6, 1:43 pm, Alex Young <a...@blackkettle.org> wrote:
> Alex Young wrote:
> > srinsri...@gmail.com wrote:
> >> Here is a simple test case
>
> >> s = <VariableValue>\nXXX\n</VariableValue>\n\n<VariableValue>
> >> \n<Choice> Administrative Support - Supervisors<Choice>\n</
> >> VariableValue>\n\n"
> > If it's actually XML, just use REXML. Anything else is asking for
> > trouble, really.
>
> Sorry, I didn't notice that your <Choice> tags aren't matched. Is that
> intentional? If so, ignore my suggestion - REXML clearly won't work.
>
> --
> Alex

the content can be quite nonstandard and have mismatched tags etc
(like real life html).. so this is not xml
I will use rexml when the input is xml.. thanks for your suggestion.
this group is very useful for newbies.




Peter Szinek

4/6/2007 6:34:00 PM

0

btw, if the content is funky, you could still try Hpricot - it handles
such crap surprisingly nicely, and unless you would like to match more
complicated things than a text between an opening and closing tag, it
will really make your life easier.

Cheers,
Peter

--
http://www.rubyra... :: Ruby and Web2.0 blog
http://s... :: Ruby web scraping framework
http://rubykitch... :: The indexed archive of all things Ruby