我有一位教授要求我们删除HTML标记(<和>中的任何内容),而不使用removeAll方法。
我目前有这个:
public static void main(String[] args)
throws FileNotFoundException {
Scanner input = new Scanner(new File("src/HTML_1.txt"));
while (input.hasNext())
{
String html = input.next();
System.out.println(stripHtmlTags(html));
}
}
static String stripHtmlTags(String html)
{
int i;
String[] str = html.split("");
String s = "";
boolean tag = false;
for (i = html.indexOf("<"); i < html.indexOf(">"); i++)
{
tag = true;
}
if (!tag)
{
for (i = 0; i < str.length; i++)
{
s += str[i];
}
}
return s;
}
这就是文件中的内容:
<html>
<head>
<title>My web page</title>
</head>
<body>
<p>There are many pictures of my cat here,
as well as my <b>very cool</b> blog page,
which contains <font color="red">awesome
stuff about my trip to Vegas.</p>
Here's my cat now:<img src="cat.jpg">
</body>
</html>
这就是输出的样子:
My web page
There are many pictures of my cat here,
as well as my very cool blog page,
which contains awesome
stuff about my trip to Vegas.
Here's my cat now:
答案 0 :(得分:7)
String
在Java +中是不可变的你永远不会显示任何东西我建议您close
使用Scanner
完成后(作为最佳做法),并从用户的HOME目录中读取HTML_1.txt
文件。 close
最简单的方法是try-with-resources
喜欢
public static void main(String[] args) {
try (Scanner input = new Scanner(new File(
System.getProperty("user.home"), "HTML_1.txt"))) {
while (input.hasNextLine()) {
String html = stripHtmlTags(input.nextLine().trim());
if (!html.isEmpty()) { // <-- removes empty lines.
System.out.println(html);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
由于String
是不可变的,我建议StringBuilder
删除HTML标记,例如
static String stripHtmlTags(String html) {
StringBuilder sb = new StringBuilder(html);
int open;
while ((open = sb.indexOf("<")) != -1) {
int close = sb.indexOf(">", open + 1);
sb.delete(open, close + 1);
}
return sb.toString();
}
当我跑上面的时候,我得到了
My web page
There are many pictures of my cat here,
as well as my very cool blog page,
which contains awesome
stuff about my trip to Vegas.
Here's my cat now:
答案 1 :(得分:1)
除非我疯了,否则你不会打印任何东西。由于没有函数或变量接收返回的字符串,因此返回更改并立即销毁。
更改
stripHtmlTags(html);
到
System.out.println(stripHtmlTags(html));
您也可以将标记设置为true或false,将其应用于整行。如果您在标签中,则需要跟踪并忽略这些字符。
因此循环遍历字符串html的每个字母。如果是&lt;你知道标签正在开始,否则如果它是一个&gt;标签即将结束,如果它们不是其中任何一个(其他任何东西),那么如果你没有将它添加到字符串中,请检查你是否在标签(布尔标签)中。
答案 2 :(得分:1)
像生活中的大多数事情一样,有一种方法可以让它发挥作用,但主要问题是......
for (i = html.indexOf("<"); i < html.indexOf(">"); i++) {
tag = true;
}
if (!tag) {
for (i = 0; i < str.length; i++) {
s += str[i];
}
}
文字以<html>
开头,这意味着当第一个for-loop
结束时,i
将等于4
而tag
将为true
},这意味着它会跳过if
块,然后......存在方法......
你需要保持循环,直到用完文本......
最简单的解决方案可能是从String
开始,然后检查每个字符,忽略<...>
StringBuilder sb = new StringBuilder(64);
boolean ignore = false;
for (int index = 0; index < text.length(); index++) {
if (text.charAt(index) == '<') {
ignore = true;
} else if (text.charAt(index) == '>') {
ignore = false;
} else if (!ignore) {
sb.append(text.charAt(index));
}
}
return sb.toString();
然后确保打印结果System.out.println(stripHtmlTags(html));
另一种解决方案(效率更高)是从<...>
的开头删除所有String
内容,直到String
没有任何内容。 ..
StringBuilder html = new StringBuilder(text);
StringBuilder result = new StringBuilder(64);
int index = 0;
while (html.length() > 0) {
int startIndex = html.indexOf(">");
if (index == -1) {
// Only plain text remaining...
result.append(html.toString());
html.delete(0, html.length());
} else {
html.delete(0, startIndex + 1);
int endIndex = html.indexOf("<");
if (endIndex > 0) {
result.append(html.substring(0, endIndex));
html.delete(0, endIndex);
}
}
}
return result.toString();
我在这里使用了StringBuilder
,因为它比String
级联或将String#substring
的结果分配回另一个String
更有效率
如果你想成为“超级”,你可以使用正则表达式和String#split
String[] parts = text.split("<(.*?)>");
StringBuilder sb = new StringBuilder(64);
for (String part : parts) {
sb.append(part);
}
return result.toString();
答案 3 :(得分:0)
一个小的递归方法
static String stripHtmlTags2(String html)
{
int startIndex = html.indexOf("<");
int endIndex = html.indexOf(">");
String stripedString = html;
//Assuming an end for every start tag
if (startIndex!=-1){
stripedString = html.substring(0,startIndex);
stripedString = stripedString+html.substring(endIndex+1);
stripedString = stripHtmlTags2(stripedString);
}
return stripedString;
}
使用like(在你的主要部分)
StringBuilder htmlFreeString = new StringBuilder();
while (input.hasNextLine())
{
String html = input.nextLine();
htmlFreeString.append(stripHtmlTags2(html));
}
System.out.print(htmlFreeString.toString());