我需要从html表单中解析字段名称和值以添加到我的数据库中。我知道我可以去寻找 “输入名称='”然后启动另一个查找以找到结束“'”并通过mid函数获取数据然后执行相同操作 通过find“value ='”获取价值 我想知道是否有一种更简单的方法来循环文档并提取所有输入名称和相关值?
以下是我的解析页面的示例
<input name='a_glare' value='B' class='inputbox-highlighted-false' size='1' maxlength='1'>
</td>
<td align="center">
<input name='a_testani' value='' class='inputbox-highlighted-false' size='1' maxlength='1'>
</td>
<td align="center">
<input name='a_tksig' value='EC' class='inputbox-highlighted-false' size='2' maxlength='2'>
</td>
<td align="center">
<input name='a_sacnon' value='' class='inputbox-highlighted-false' size='1' maxlength='1'>
</td>
<td align="center">
<input name='a_ot' value='' class='inputbox-highlighted-false' size='1' maxlength='1'>
</td>
<td align="center">
<input name='a_ovlp' value='' class='inputbox-highlighted-false' size='1' maxlength='1'>
答案 0 :(得分:4)
对于解析html,我建议使用JSoup而不是正则表达式。我刚开始使用JSoup,发现它非常简单易用。只需下载jar并将其添加到your application class path即可。
我无论如何都不是专家,但能够使用此片段打印示例html页面中的所有“输入”字段:
<cfscript>
// parse html string into document
jsoup = createObject("java", "org.jsoup.Jsoup");
doc = jsoup.parse( yourHTMLContentString );
// grab all "input" fields
fields = doc.select("input");
for (elem in fields) {
// get attributes of each field
fieldName = elem.attr("name");
fieldValue = elem.attr("value");
fieldType = elem.attr("type");
// display values
WriteOutput("<br>type: "& fieldType
&" name: "& fieldName
&" value: "& fieldValue
);
}
</cfscript>
(..是的,尽管你的绰号,我我暗示“JSoup4You”)
<强>更新强>
fields
变量是一个数组。所以你可以用同样的方式在cfml中循环它。它似乎是双重工作,但如果您愿意,可以将输入名称和值提取到您自己的结构数组中(或者您喜欢的任何CF构造)。例如:
// initialize storage array
yourArray = [];
for (elem in fields) {
// extract field properties into a structure
data = { name=elem.attr("name")
, value=elem.attr("value")
, type=elem.attr("type")
};
// store in array
arrayAppend(yourArray, data);
}
// display array contents
WriteDump(yourArray);
答案 1 :(得分:1)
您可以尝试使用两个正则表达式解析它以获取字段名称和字段值。这就是我使用您的示例HTML提出的。
<cfsavecontent variable="foo">
<input name='a_glare' value='B' class='inputbox-highlighted-false' size='1' maxlength='1'>
</td>
<td align="center">
<input name='a_testani' value='' class='inputbox-highlighted-false' size='1' maxlength='1'>
</td>
<td align="center">
<input name='a_tksig' value='EC' class='inputbox-highlighted-false' size='2' maxlength='2'>
</td>
<td align="center">
<input name='a_sacnon' value='' class='inputbox-highlighted-false' size='1' maxlength='1'>
</td>
<td align="center">
<input name='a_ot' value='' class='inputbox-highlighted-false' size='1' maxlength='1'>
</td>
<td align="center">
<input name='a_ovlp' value='' class='inputbox-highlighted-false' size='1' maxlength='1'>
</cfsavecontent>
<!--- extract the fieldnames and field values attributes --->
<cfset fieldnames = rematch("name='[a-z_]+'", foo)>
<cfset fieldvalues = rematch("value='[^']*'", foo)>
<!--- extract the values and build a struct of fieldname : value --->
<cfset keys = {}>
<cfloop from="1" to="#arraylen(fieldnames)#" index="index">
<cfset keys[rereplace(fieldnames[index], "name='|'", "", "all")] = rereplace(fieldvalues[index], "value='|'", "", "all")>
</cfloop>
<cfdump var="#keys#">
答案 2 :(得分:0)
这里有一个想法,可能没有比仅仅重新制作每件事更好的了。
1)为每个输入值添加一个结束斜杠,使它们如下所示:
<input name='a_ot'
value=''
class='inputbox-highlighted-false'
size='1'
maxlength='1'/>
2)从<table>
标记开始,以</table>
标记结束,提取整个表格。
3)使用XMLParse将表解析为XML对象,如下所示:
现在你有一个带有TD tages数组的XML对象,每个TD对象都有一个具有name和value属性的INPUT子节点。您可以使用cfdump和循环代码来提取或清理它。
同样,这可能无法节省您的时间,具体取决于HTML的混乱程度以及您需要多大努力才能找出XML。祝你好运。