Skip to content

Commit 3ff032c

Browse files
committed
HTML Elements
1 parent 5ba8309 commit 3ff032c

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed

src/medium/HtmlElements.java

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package medium;
2+
3+
import java.util.Stack;
4+
import java.util.regex.Matcher;
5+
import java.util.regex.Pattern;
6+
7+
/**
8+
* Have the function HTMLElements(str) read the str parameter being passed
9+
* which will be a string of HTML DOM elements and plain text.
10+
* ---
11+
* The elements that will be used are: b, i, em, div, p.
12+
* For example: if str is "<div><b><p>hello world</p></b></div>" then this string of DOM elements
13+
* is nested correctly so your program should return the string true.
14+
* ---
15+
* If a string is not nested correctly, return the first element encountered where,
16+
* if changed into a different element, would result in a properly formatted string.
17+
* ---
18+
* If the string is not formatted properly,
19+
* then it will only be one element that needs to be changed.
20+
* For example: if str is "<div><i>hello</i>world</b>"
21+
* then your program should return the string div
22+
* because if the first <div> element were changed into a <b>,
23+
* the string would be properly formatted.
24+
*/
25+
public class HtmlElements {
26+
27+
/**
28+
* A stack helps to determine if elements are nested correctly.
29+
*/
30+
private static final Stack<String> stack = new Stack<>();
31+
32+
/**
33+
* Process a string to prepare for further inspection.
34+
* 1. convert to lowercase
35+
* 2. remove text content between tags
36+
* 3. add spaces between tags
37+
* 4. remove multiple spaces
38+
* 5. trim (remove leading and trailing spaces)
39+
* 6. split to array of strings
40+
*
41+
* @param str input string
42+
* @return parsed string
43+
*/
44+
private static String[] parseElements(String str) {
45+
return str
46+
.toLowerCase()
47+
.replaceAll(">[^<]+", ">")
48+
.replaceAll("([>])(?=[<])", "$1 ")
49+
.replaceAll(" +", " ")
50+
.trim().split(" ");
51+
}
52+
53+
/**
54+
* Checks if a string is an opening tag.
55+
*
56+
* @param tag a string to check
57+
* @return true if a string is an opening tag
58+
*/
59+
private static boolean isOpeningTag(String tag) {
60+
Pattern pattern = Pattern.compile("<[a-z]>|<[a-z][a-z1-9]+>");
61+
Matcher matcher = pattern.matcher(tag);
62+
return matcher.find();
63+
}
64+
65+
/**
66+
* Checks if a string is an closing tag.
67+
*
68+
* @param tag a string to check
69+
* @return true if a string is a closing tag
70+
*/
71+
private static boolean isClosingTag(String tag) {
72+
Pattern pattern = Pattern.compile("</[a-z]>|</[a-z][a-z1-9]+>");
73+
Matcher matcher = pattern.matcher(tag);
74+
return matcher.find();
75+
}
76+
77+
/**
78+
* Get an enclosed value.
79+
*
80+
* @param tag input tag with angle brackets
81+
* @return the enclosed value of a tag
82+
*/
83+
private static String getTagValue(String tag) {
84+
return tag.replaceAll("[></]", "");
85+
}
86+
87+
/**
88+
* HTML Elements function.
89+
*
90+
* @param str input string
91+
* @return "true" if elements are nested correctly, or an enclosed tag value if not.
92+
*/
93+
private static String htmlElements(String str) {
94+
String[] parsedTags = parseElements(str);
95+
for (String tag : parsedTags) {
96+
if (isOpeningTag(tag)) {
97+
stack.push(tag);
98+
} else if (isClosingTag(tag) && !stack.isEmpty()) {
99+
if (getTagValue(stack.peek()).equals(getTagValue(tag))) {
100+
stack.pop();
101+
}
102+
}
103+
}
104+
return stack.isEmpty() ? "true" : getTagValue(stack.peek());
105+
}
106+
107+
/**
108+
* Entry point.
109+
*
110+
* @param args command line arguments
111+
*/
112+
public static void main(String[] args) {
113+
String result1 = htmlElements("<div><b><p>hello world</p></b></div>");
114+
System.out.println(result1);
115+
String result2 = htmlElements("<div><b><p>hello world</b></div>");
116+
System.out.println(result2);
117+
}
118+
119+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy