今天我遇到了这个问题。我正在使用包含大量JSP的基于Web的(Struts 2)项目,大多数input, select, table
和a
元素仅使用name
属性定义,没有{{ 1}}设置,例如:
id
到目前为止一直很好,除了不幸的是,这些字段有很多javascript验证,并且在我离开大部分字段之前我可以阅读代码实际上引用<input name="myname" class="myclass" value="" type="text"/>
的元素。
这里的问题是,这是一个旧的应用程序(实际上不是那么老)只与IE-6和IE-7兼容(我没有搜索网络,以了解IE实际上似乎找到了元素只有document.getElementById
属性,但我想它必须做点什么)。没有其他任何一个浏览器抱怨和哭泣。
所以,我正在尝试提出一个简单的解决方案:使用name
属性查找定义input, select, table
和a
元素的所有JSP,但不查找name
为了修复HTML。
使用我的好朋友http://rubular.com我想出了以下内容:
id
这将捕获没有/<(?:(input|select|a|table))\s+((?!id).)*>
的每个引用元素。但是,我怎么能断言只有id
匹配的那些?
哦,另一个重点。元素的定义是一行的,所以最有可能的不是:
name
答案 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脚本使用(完全注释的)正则表达式来匹配INPUT
,SELECT
,TABLE
和A
元素的起始标记,这些元素具有{{ 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。
希望它有所帮助!