ColdFusion 9重新替换HTML标记的第n次出现

Rev*_*ent 2 regex coldfusion html-parsing coldfusion-9

我在ColdFusion 9中的变量中存储了以下HTML.我需要在第4个之后插入一个新的表行</tr>.即在提交按钮之前.

<form name="form1" id="form1" action="" method="post">
    <table>
    <tr style="visibility:hidden;display:none;"><td> <input type="hidden" id="ref1" name="ref1" value="1" > </td></tr> 
    <tr style="visibility:hidden;display:none;"><td> <input type="hidden" id="ref2" name="ref2" value="2" > </td></tr> 
    <tr>
        <th style="text-align:left;">Name&nbsp;*&nbsp;</th>
        <td><input type="text" name="foo" id="foo" size="30" maxlength="50" value=""></td>
    </tr>
    <tr>
        <th title="Please enter plain text or HTML." style="cursor:help;text-align:left;">Comment&nbsp;*&nbsp;</th>
        <td><textarea name="bar" id="bar" cols="40" rows="10" ></textarea></td>
    </tr>
    <tr>
        <th colspan="1"></th>
        <td>
            <input style="width:80px" type="submit" value="Submit">
            <input style="width:80px" type="button" value="Cancel">
        </td>
    </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

ReReplace似乎是要走的路,但是我无法正确使用正则表达式.另一个选择是拆分字符串并使用我的新HTML在中间重建它.任何建议,将不胜感激.

Pet*_*ton 5

正则表达式是错误的工具 - 你想要一个HTML解析器.

以下是使用JSoup执行此操作的方法:

<cfsavecontent variable="InputHtml">
    [insert code from question]
</cfsavecontent>

<cfsavecontent variable="NewRow">
    <tr><th>whatever</th><td>stuff</td></tr>
</cfsavecontent>

<!--- Read "Creating Objects From Jar Files" --->
<cfset jsoup = createObject('java','org.jsoup.Jsoup') />

<cfset HtmlDom = jsoup.parse(InputHtml) />

<cfset HtmlDom.select('tr:eq(4)').after( NewRow ) />

<cfoutput>
    <pre>#XmlFormat(HtmlDom.body().html())#</pre>
</cfoutput>
Run Code Online (Sandbox Code Playgroud)

您可以在JSoup Selector API中查看支持哪些选择器的详细信息

如果您不知道/关心表格中有多少行,您可以...

HtmlDom.select('table>tbody').append( NewRow )
Run Code Online (Sandbox Code Playgroud)

...只是在最后添加新行.


从Jar文件创建对象

如果您复制并粘贴它,上面的代码很可能不会立即生效,因为您的服务器不知道JSoup - 您需要下载Jar文件并将其放在合理的位置.

对于CF9,您需要将jsoup-1.6.3.jar复制到{coldfusion}/lib目录中,然后重新启动服务器.

对于CF10,您可以this.JavaSettings在Application.cfc中使用(如此处所述)将其放在不同的位置.

对于Railo和OpenBD,您可以将JAR文件的位置指定为第三个参数,例如:

<cfset jsoup = createObject('java','org.jsoup.Jsoup','lib/jsoup-1.6.3.jar') />
Run Code Online (Sandbox Code Playgroud)