正则表达式 - 查找具有name属性但不是id的元素

时间:2012-11-08 02:08:18

标签: html regex validation tags

今天我遇到了这个问题。我正在使用包含大量JSP的基于Web的(Struts 2)项目,大多数input, select, tablea元素仅使用name属性定义,没有{{ 1}}设置,例如:

id

到目前为止一直很好,除了不幸的是,这些字段有很多javascript验证,并且在我离开大部分字段之前我可以阅读代码实际上引用<input name="myname" class="myclass" value="" type="text"/>的元素。

这里的问题是,这是一个旧的应用程序(实际上不是那么老)只与IE-6和IE-7兼容(我没有搜索网络,以了解IE实际上似乎找到了元素只有document.getElementById属性,但我想它必须做点什么)。没有其他任何一个浏览器抱怨和哭泣。

所以,我正在尝试提出一个简单的解决方案:使用name属性查找定义input, select, tablea元素的所有JSP,但不查找name为了修复HTML。

使用我的好朋友http://rubular.com我想出了以下内容:

id

这将捕获没有/<(?:(input|select|a|table))\s+((?!id).)*>的每个引用元素。但是,我怎么能断言只有id匹配的那些?

哦,另一个重点。元素的定义是一行的,所以最有可能的不是:

name

4 个答案:

答案 0 :(得分:6)

试试这个:

<(?:input|select|a|table)\s+(?=[^>]*\bname\s*=)(?![^>]*\bid\s*=)[^>]*>

说明:

<                           "<"
(?:input|select|a|table)    One of "input", "select", "a", "table"
\s+                         Whitespace
(?=                         Positive lookahead
[^>]*                           Anything up to but excluding ">"
\b                              Word boundary
name                            "name"
\s*                             Possible whitespace
=                               "="
)
(?!                         Negative lookahead
[^>]*                           Anything up to but excluding ">"
\b                              Word boundary
id                              "id"
\s*                             Possible whitespace
=                               "="
)
[^>]*                       Anything up to but excluding ">"
>                           ">"

答案 1 :(得分:2)

声明:

每个人都会告诉你不要使用正则表达式解析HTML,他们是对的。也就是说,以下正则表达式解决方案应该为一次性任务做一个相当不错的工作(如果100%可靠性不是一个问题)。

正则表达式匹配具有一个属性但不是另一个属性的标记:

以下经过测试的PHP脚本使用(完全注释的)正则表达式来匹配INPUTSELECTTABLEA元素的起始标记,这些元素具有{{ 1}}属性但没有NAME属性。该脚本会在每个开始标记中插入一个新的ID属性,该属性与现有的ID属性相同:

NAME

答案 2 :(得分:0)

如果我们在javascript中使用getElementById,那么它可以在Internet Explorer中使用,如果与id中使用的名称相同的元素存在,但它不适用于所有其他浏览器(Firefox,Chrome,Safari等)。

可以通过以下代码消除它。

function includeIdIfNotExist(element) {
    var id = element.getAttribute('id');
    var name = element.getAttribute('name');
    if (name && !id) {
        element.id = name;
    }
}
function addMissingId() {
    var elementsToAddId = ['input', 'select'];
    for (var j = 0; j < elementsToAddId.length; j++) {
        var inputElements = document.getElementsByTagName(elementsToAddId[j]);
        for (var i = 0; i < inputElements.length; i++) {
            includeIdIfNotExist(inputElements[i]);
        }
    }
}
document.onload = addMissingId();

答案 3 :(得分:0)

如果要搜索名称但不是id的元素,并将id等于名称,则可以按如下方式进行查找和替换:

查找:

(<(?:input|select|table|form|textarea)\s+)(?=[^>]*\bname\s*="(\w+)")((?![^>]*\bid\s*=)[^>]*>)

它适用于输入,选择,表格,表格,文本区域。您可以从输入| select | table | form | textarea 部分添加或删除html标签。它还将检查元素是否具有id

替换为:

$1id="$2" $3

这将添加id =&#34; [nameValue]&#34;在您之前选择的html标签上有一个名称但不是id。

希望它有所帮助!