对于正则表达式,我真的是初学者,我不确定从哪里开始。我从网页上抓取了一些HTML代码并存储在变量中,它看起来像这样:
<thead><tr>
<th></th>
<th>GENERAL INFORMATION</th>
<th></th>
<th>DETAILED DATA</th>
</tr></thead>
<tbody><tr>
<th>ID</th>
<td>123456789ABCD</td>
<th>Field1</th>
<td>6 = (Some-Specification (3 or more details))</td>
</tr></tbody>
<tbody><tr>
<th>AGL</th>
<td>1 - United States ; TH - Some Data</td>
<th>Field2</th>
<td>7 = (Option/Other Option)</td>
</tr></tbody>
<tbody><tr>
<th>MANUFACTURER</th>
<td>2010 SPECIFICATION (ADSD: HMKC)</td>
<th>Field3</th>
<td>8 = (My Type)</td>
</tr></tbody>
<tbody><tr>
<th>MODEL</th>
<td>6X4 MY-MODEL/SOME_SPECS LONG SPECIFICATION, BLAH</td>
<th>Field4</th>
<td>9 = (STUFF/OTHER STUFF)</td>
</tr></tbody>
<tbody>
然后有更多相同的...我想将这些单元格中的数据解析为变量。 (例如,将“123456789ABCD”解析为ID变量)我正在使用ColdFusion,并且正在考虑使用REFindNoCase
,REReplaceNoCase
,SpanExcluding
等方法...我知道如何才能完成这个?或者,如果您不熟悉ColdFusion,即使只是解析此数据所需的正则表达式也非常有用。
答案 0 :(得分:7)
不要将Regex用于HTML。它会摧毁你。
如果你正在做很多这样的事情,你应该得到一个HTML工具,例如TagSoup,它可以规范化HTML。如果您正在使用来自一个站点的Web页面,那么您可以创建一个XSLT样式表(或使用XPath的DOM工具),它可以提取您想要的单元格。
您的单元格的X路径(我省略了HTML命名空间)可能是
//tbody/tr[1]/td[1]
或者您可能希望按ID
查找行//tbody/tr[th='ID']]/td
[HTML看起来相当混乱 - 它在同一th
中使用td
和tr
,这不是惯用的。]
答案 1 :(得分:1)
使用CF xml parser, XmlParse。看起来它基于严格的XML,所以请确保通过类似htmltidy
。
答案 2 :(得分:1)
我同意这个平台的主要观点,即用正则表达式解析HTML并不是“黄金之路”。但在某些情况下,它只是最简单的方法,它只是做它需要做的事情。
这个正则表达式应该做你需要的:
<th>((?!</th>).)*</th>\s*<td>((?!</td>).)*</td>
使用捕获组1作为键,使用组2作为值。
我不知道ColdFusion所以我不能告诉你如何应用它。