如何将HTML标记参数值复制到同一标记的另一个参数中(对于源文本中的每个标记)?

时间:2014-02-19 03:49:34

标签: html xml regex refactoring editor

我有一个巨大的HTML表单,其中所有输入都设置了name个参数。我还想为每个输入设置id(等于名称)。由于实际输入太多,手动复制和粘贴会很糟糕。当然,我可以编写一个程序来解析标签并做到这一点,但这看起来有点矫枉过正。有什么建议吗?

更新:我的意思是在HTML源代码级而不是在运行时执行它。

UPDATE2:该任务实际上意味着替换name="my-field"模式的每一次出现(代替my-field可以有任何合理的东西(但通常会包含负数,所以只支持字母是不够的) ))name="my-field" id="my-field"。我相信这可以用sed之类的东西来完成,但令我感到羞耻的是,我很难掌握正则表达式。

4 个答案:

答案 0 :(得分:2)

您可以使用javascript来实现此目的:这样的事情应该有效

<html>
<head>
<script type="text/javascript">
**function loadId() { 
var inputs = document.getElementsByTagName('input');
for (var i = 0, len = inputs.length; i < len; i++) {
inputs[i].id = inputs[i].name;
}
}**
</script>
</head>
<body onload="loadId()">
<input name = "test1" /> 
<input name = "test2" /> 
<input name = "test3" /> 

</body>
</html>

答案 1 :(得分:1)

如果你的HTML是XHTML(格式正确)(或者你可以使用JTidy将其转换为XHTML),你可以使用XSLT转换将name属性的内容复制到新的id属性。

此样式表:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output method="html" indent="yes"/>

    <xsl:template match="@*">
        <xsl:attribute name="{name()}">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>

    <xsl:template match="*">
         <xsl:copy>
             <xsl:apply-templates select="*|@*|text()"/>
         </xsl:copy>
    </xsl:template>

    <xsl:template match="input">
        <xsl:copy>
            <xsl:attribute name="id">
                <xsl:value-of select="@name" />
            </xsl:attribute>
            <xsl:apply-templates select="@*" />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

将使用此内容转换文件:

<form>
    <div class="inputs">
        <p style="color:red">Text</p>
        <input type="text" name="a" />
        <input type="password" name="b" />
        <input type="checkbox" name="c" />
        <input type="radio" name="d" />
    </div>
</form>

进入此区域(使用id属性的内容向每个input添加新的name属性:

<form>
   <div class="inputs">
      <p style="color:red">Text</p>
      <input id="a" type="text" name="a">
      <input id="b" type="password" name="b">
      <input id="c" type="checkbox" name="c">
      <input id="d" type="radio" name="d">
   </div>
</form>

您可以使用命令行工具行Saxon运行XSLT处理器。

答案 2 :(得分:1)

我只想使用正则表达式搜索&amp;替换HTML文件。

给定输入......

<html>
  <head>
    <title>Whatever</title>
  </head>
  <body>
    <form>
      <input name="foo"/>
      <input name="bar"/>
      <input name="foo-bar"/>
    </form>
</html>

...,正则表达式搜索......

name="([a-zA-Z\-]+)"

......并替换为......

name="$1" id="$1"

......会产生:

<html>
  <head>
    <title>Whatever</title>
  </head>
  <body>
    <form>
      <input name="foo" id="foo"/>
      <input name="bar" id="bar"/>
      <input name="foo-bar" id="foo-bar"/>
    </form>
</html>

上述正则表达式搜索&amp;使用.NET's regex syntax替换值,但它们很容易适应Java regex syntax或其他正则表达式语法。

实际上,使用RegexPlanet Java regex tester,我confirmed上面的正则表达式搜索&amp;替换值应该与编辑器或其他支持Java正则表达式语法的工具一样。

答案 3 :(得分:0)

你可以试试这个:

$("form#myForm :input").each(function(){
    var input = $(this); 
    input.attr('id', input.attr('name'));
});

尚未测试,但猜测应该有效。