使用Regex / C#</button>将<input type =“radio”/>转换为<button>

时间:2010-11-23 21:37:17

标签: c# asp.net regex

奇怪的问题,但我不会浪费时间解释为什么我需要这样做,只是我需要这样做。

我有以下内容:

<input type="radio" name="eq_9" id="eq_9_2"  onclick="nextStepID_load(this);" value="Installer." title="912" /><label for="eq_9_2">Installer</label> <br />

我需要把它变成:

<button type="button" name="eq_9" id="eq_9_2" onclick="nextStepID_load('912');">Installer</button><br />

我正在使用C#/ asp.net(3.5或更低版本)和javascript for performJS(这是一个占位符,直到我弄清楚如何替换html)。

请注意,提供此信息的来源是向我发送一个包含许多输入行的字符串。我需要用对它有效的信息替换每一行。

现在,我已经尝试添加.Replace(“”,“\”&gt;“);它确实替换了无线电标签,但显然使它看起来很可怕代码,并且不会删除标签或放标签之间的标签内容。

我确信这可能是正则表达式最好的解决方法,但我对正则表达式并不是很熟悉。我一直在用regexlib玩弄,看看我是否可以自己找出一个正则表达式...这是我到目前为止所拥有的,虽然我想我离我很远。

string strRegex = @"<input type=""radio"" [\s]*=[\s]*""?[^\w_]*""?[^>]*>";
RegexOptions myRegexOptions = RegexOptions.IgnoreCase | RegexOptions.Multiline;
Regex myRegex = new Regex(strRegex, myRegexOptions);
string strTargetString = @"<input type=""radio"" name=""eq_9"" id=""eq_9_2""  onclick=""nextStepID_load(this);"" value=""Installer."" title=""912"" /><label for=""eq_9_2"">Installer</label> <br />";
string strReplace = "<button type="button"></button>";
return myRegex.Replace(strTargetString, strReplace);

3 个答案:

答案 0 :(得分:4)

不要使用正则表达式来处理HTML。对于95%的案例来说,它只够灵活,这应该告诉你这是错误的工具。

使用HTML Agility Pack,您可以加载文档并使用类似的内容替换...

HtmlDocument doc = new HtmlDocument();
doc.Load(@"C:\Path\To\Page.html");

HtmlNode radios = doc.SelectNodes("//input[@type=radio]");

foreach (HtmlNode node in radios)
{
    HtmlAttribute name = node.Attributes["name"];

    if (name != null && name.ToLower().StartsWith("eq_"))
    {
        //Build your button element and replace the radio using ReplaceChild
    }
}

答案 1 :(得分:2)

  

我确信这可能是正则表达式最好的解决方法,但我对正则表达式并不是很熟悉。

我担心这不是一个好兆头,因为如果你对正则表达不是很熟悉,那么任何最不可能通过正则表达式来解决。 :(

没有足够的问题描述可以确定即使正则表达式向导是否可以使用正则表达式快速制作解决方案。我很确定你需要做的不仅仅是交换另一个固定字符串,因为如果你这样做,你已经做到了。所以它的一部分必须参数化。我只是不知道哪个。

不计算空格,你会说你的问题是改变这种形式的输入:

<input 
    type="radio"
    name="eq_X"
    id="eq_X_Y"
    onclick="nextStepID_load('XNY');"
    value="Z."
    title="XNY"  
/>
<label for="eq_X_Y"> Z </label>
<br />

进入此表单的输出:

<button 
    type="button" 
    name="eq_X" 
    id="eq_X_Y" 
    onclick="nextStepID_load('XNY');" 
>
Z
</button>

<br />

如您所见,我已参数化 X Y Z N 。以下是我的问题:

  1. 您是否会说我的问题参数化准确描述了它?

  2. 这是否在某些特定的DTD下验证,如果是,哪一个?

  3. 属性是否始终不是那些?

  4. 始终以精确的顺​​序出现的属性是什么?

  5. 你有多少这样的事情需要做?

  6. 这是以纯HTML形式出现的,还是实际隐藏在某些Javascript中?

  7. 您是否知道是否有<script><style>元素或<!-- ... -->条评论包含的内容与您正在寻找的内容相符?

    < / LI>
  8. 你知道在你想要的东西中间是否有任何这样的元素介入吗?

  9. NAME="VALUE"形式的所有属性是否只有双引号,从不单引号或完全省略?

  10. 标识符的大小写是否总是小写?

  11. 它们都在一个文件中吗?

  12. 是否有某些原因导致您的输出样本丢失了一些非重要的空格?

  13. 这些问题显示了为什么问题几乎肯定会比看上去更加复杂 - 这引出了几个最后的问题:

    1. 您以前使用过HTML解析类吗?

    2. 您想了解具体方法吗?

答案 2 :(得分:1)

本练习使用正则表达式完成您的操作。

这是它的工作原理: 我不替换原始字符串中的值。相反,我接受目标字符串,我们想要到达,并使用正确的值构建它。 我相信这种方法会给你灵活性,你可以根据需要格式化输出字符串。

  • inputList是一个测试列表 例。
  • 目标是目标 使用占位符的字符串,我们可以格式化它 想要/需要/必须。
  • GetValue()方法利用regex参数来寻找特定值。它将html标记视为KeyValue对,它接受Value并删除封闭的引号。
  • 最后使用string.Format(),我们根据需要构建输出字符串。

这是完整的代码,所以你可以尝试一下。您还可以将这段代码的想法变成一种方法,将其集成到您的解决方案中。

如果它也适合你,请告诉我。

      static void Main(string[] args)
    {

        List<string> inputList = new List<string>();
        inputList.Add("<input type=\"radio\" name=\"eq_9\" id=\"eq_9_2\"  onclick=\"nextStepID_load(this);\" value=\"Installer.\" title=\"912\" /><label for=\"eq_9_2\">Installer</label> <br />");
        inputList.Add("<input type=\"radio\" name=\"eq_10\" id=\"eq_9_3\"  onclick=\"nextStepID_load(this);\" value=\"Installer1.\" title=\"913\" /><label for=\"eq_9_3\">InstallerA</label> <br />");
        inputList.Add("<input type=\"radio\" name=\"eq_11\" id=\"eq_9_4\"  onclick=\"nextStepID_load(this);\" value=\"Installer2.\" title=\"914\" /><label for=\"eq_9_4\">InstallerB</label> <br />");
        inputList.Add("<input type=\"radio\" name=\"eq_12\" id=\"eq_9_5\"  onclick=\"nextStepID_load(this);\" value=\"Installer3.\" title=\"915\" /><label for=\"eq_9_5\">InstallerC</label> <br />");
        inputList.Add("<input type=\"radio\" name=\"eq_13\" id=\"eq_9_6\"  onclick=\"nextStepID_load(this);\" value=\"Installer4.\" title=\"916\" /><label for=\"eq_9_6\">InstallerD</label> <br />");

        string output = string.Empty;
        string target = "<button type=\"button\" name=\"{0}\" id=\"{1}\" onclick=\"nextStepID_load('{2}');\">{3}</button><br />";

        foreach (string input in inputList)
        {
            string name = GetValue(@"(?<Value>name=[\S]+)", input);
            string id = GetValue(@"(?<Value>id=[\S]+)", input);
            string title = GetValue(@"(?<Value>title=[\S]+)", input);
            string value = GetValue(@"(?<Value>value=[\S]+)", input);

            output = string.Format(target, name, id, title, value);
            System.Diagnostics.Debug.WriteLine(output);
        }

    }

    private static string GetValue(string pattern, string input)
    {
        Regex regex = new Regex(pattern);
        Match match = regex.Match(input);
        return match.ToString().Split('=').Last().Replace("\"", string.Empty);
    }

这是输入:

    <input type="radio" name="eq_9" id="eq_9_2"  onclick="nextStepID_load(this);" value="Installer." title="912" /><label for="eq_9_2">Installer</label> <br />
    <input type="radio" name="eq_10" id="eq_9_3"  onclick="nextStepID_load(this);" value="Installer1." title="913" /><label for="eq_9_3">InstallerA</label> <br />
    <input type="radio" name="eq_11" id="eq_9_4"  onclick="nextStepID_load(this);" value="Installer2." title="914" /><label for="eq_9_4">InstallerB</label> <br />
    <input type="radio" name="eq_12" id="eq_9_5"  onclick="nextStepID_load(this);" value="Installer3." title="915" /><label for="eq_9_5">InstallerC</label> <br />
    <input type="radio" name="eq_13" id="eq_9_6"  onclick="nextStepID_load(this);" value="Installer4." title="916" /><label for="eq_9_6">InstallerD</label> <br />

这是输出:

    <button type="button" name="eq_9" id="eq_9_2" onclick="nextStepID_load('912');">Installer.</button><br />
    <button type="button" name="eq_10" id="eq_9_3" onclick="nextStepID_load('913');">Installer1.</button><br />
    <button type="button" name="eq_11" id="eq_9_4" onclick="nextStepID_load('914');">Installer2.</button><br />
    <button type="button" name="eq_12" id="eq_9_5" onclick="nextStepID_load('915');">Installer3.</button><br />
    <button type="button" name="eq_13" id="eq_9_6" onclick="nextStepID_load('916');">Installer4.</button><br />