0

我想删除html标签之间的文本,然后将其显示在textBox2中。我需要获取“<”和“>”的起始位置,然后删除标签和介于两者之间的所有内容。我不想使用正则表达式。

这是我到目前为止得到的

        string input = textBox1.Text;
        string output = textBox2.Text;
        string results;
        for (int i = 0; i < input.Length; i++)
        {
            if(input.IndexOf('<',i) !=-1 )
            {


            }
4

1 回答 1

2

这应该可以满足您的需求。但是,它不会处理存在格式错误的标记的情况。因此,例如,如果您要输入输入字符串Hello < world,则输出将是Hello

string input = textBox1.Text;
StringBuilder output = new StringBuilder(input.Length);
bool inATag = false;

for (var i = 0; i < input.Length; i++) {
    if (!inATag && input[i] != '>' && input[i] != '<') {
        output.Append(input[i]);
    } else if (input[i] == '<') {
        inATag = true;
    } else if (input[i] == '>') {
        inATag = false;
    }
}

textBox2.Text = output.ToString();

为了进一步解释发生了什么,我一次遍历输入字符串一个字符。如果我找到一个开场<,我会进入一种状态,在我找到闭幕之前,我不会将任何输入添加到输出中>

我生成输出字符串的方式是使用StringBuilderto 进行字符串连接,这比使用string output += input[i]. 不建议简单地使用 astring作为输出变量类型,因为每次将 2 个字符串连接在一起时,它都会分配一个全新且不同的字符串。随着时间的推移,这将影响性能。使用 a StringBuilder,只会分配一个字符串对象,并且不会在循环的每次迭代中创建新的字符串对象。

微软已经写了一个很好的解释为什么要使用 aStringBuilder,但一般规则是你应该在任何时候发现自己在循环内连接字符串时使用 StringBuilder 。

相反,对于已知输入字符串总是很小的情况,最好不要使用StringBuilder. StringBuilder如果您仅连接少量字符串,则创建无法克服的对象会受到惩罚。例如,如果您希望只执行 10 个字符串连接,则使用 StringBuilder 将被视为反模式。但是,如果您要连接数百个字符串,就像在这个示例中一样,它使用StringBuilder.

于 2012-12-19T06:01:41.643 回答