Seperation of tags from text in HTML file

Hi,

I'm trying to find a regex (in Ruby) to split up an html document so that tags are on their own lines, seperate from the text. See examples below.

There is a complication in that I'm evaluating the file line by line, but sometimes a tag covers more than one line.
<div align="center"><i>All Rights Reserved</i> </div>
 
<!-- should become: -->
 
<div align="center">
<i>
All Rights Reserved
</i>
</div>
 
 
<!-- the regex I've developed is:
    /(<[^>]*>?)*([^<]*)?/
    but this fails to note some tags after text.
    To exemplify, the above example becomes: -->
 
<div align="center">
<i>
All Rights Reserved
</div>
 
<!-- missing the </i> -->

Open in new window

LVL 5
SyntheticsAsked:
Who is Participating?
 
dberner9Connect With a Mentor Commented:
I've just done the following in irb:

line = %(<div align="center"><i>All Rights Reserved</i> </div>)
divided = line.scan(/(<[^>]*>|[^<]*)/).flatten.join("\n")
puts divided

which yields:

<div align="center">
<i>
All Rights Reserved
</i>
 
</div>

Does that work for you?
line.scan(/<[^>]*>|[^<]*/).join("\n")

Open in new window

0
 
Geert BormansInformation ArchitectCommented:
I would assume that this regex is OK
/(<[^>]*>?)*([^<]*)?/
but you have to make sure that you use a technique that allows multiple replacements in a single line

do you actually want to remove the line breaks inside the tag?

I would go for this regex
/(<[^<>]+(>?))/

I have an extra pair of (), so you can test whether the start of the tag falls on the end of line
then I would put a newline before the tag opener and a newline before the tag closer, if it is there
No need for matching the text in between tags
0
 
Geert BormansInformation ArchitectCommented:
PS, in order for having this working on all occurences of a tag, use gsub()

cheers

Geert
0
 
SyntheticsAuthor Commented:
That only seemed to capture the <!DOCTYPE ... > for some reason. My output code is below.
f = File.open("input.htm")
out = File.open("output.htm","w")
f.each do |line|
	tags = line.scan(/(<[^<>]+(>?))/)
	newlines = tags*"\n"
	newlines.each do |newline|
		if newline.chomp!.length > 0 then out.puts(newline) end
	end
end #f.each
out.close
f.close

Open in new window

0
 
Geert BormansInformation ArchitectCommented:
have you tried something along these lines?
f = File.open("an-html-file.htm")
f.each do |line|
      puts line.gsub(/(<[^<>]+(>?))/){|s| puts $1}
end #f.each
f.close
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.