coldfusion为某些类添加id

目前我有一堆HTML存储在一个变量中,我输出到看起来有点像这样的页面:

some stuff

a heading

a subheading

wording and such

another subheading

你明白了。

并输出如下:

  #request.oEntry.getHTMLStuff()#  

无论如何,我需要找到所有类的“subsubhead”并添加一个id =“x”,其中x对应于我对该子标题的数据库ID。

我认为这最好在Coldfusion中完成,因为数据库ID已经存在于cfquery中,并且我无法混合和匹配jQuery和ColdFusion。

目前还不确定最好的方法。

既然您喜欢jQuery但需要在CF中执行此操作,我建议使用HTML解析器JSOUP来完成此工作。 JSOUP的语法与jQuery非常相似,但在服务器端使用java(以及CF)进行操作。 下载jar并将其添加到CF类路径后,您可以像这样使用它:

   

some stuff

a heading

a subheading

wording and such

another subheading

 #HTMLEditFormat(htmlObj.body().html())# 

这输出:

  

some stuff

a heading

a subheading

wording and such

another subheading

我将id值(通过检查p标签内容)分配给子标题的特定实例的方式只是一种选择; 您还可以根据每个元素的顺序(数组中元素的顺序和查询中id的顺序)将元素与数据库查询匹配。 由你决定。

有问题的HTML片段是否可以适应XML文档(它需要具有根节点并且符合XML标准)。 如果可以,那么你可以在ColdFusion中的结果对象上使用XPath或XQuery来获取class属性中值为“subsubhead”的所有元素,然后相应地更改属性值,然后写回字符串。 示例如下:

   

some stuff

a heading

a subheading

wording and such

another subheading

请记住,在上面的示例中,在写回之前删除片段根节点。

这是我提出的代码。

  local.string = request.oEntry.getEditorial(); local.x = 0; do{ local.x = REFind("Subsubhead", local.string,local.x); if(local.x neq 0){ local.x = local.x+10; local.string = insert(" id='x'",local.string,local.x); } } while(local.x neq 0);  

这对我有用,但可能有更好的方法

您可以尝试以下方法。 我认为你甚至不需要一个正则表达式:

  #html_content# 

注意双引号内的双引号,这样字符串就不会破坏! replaceNoCase()的最终参数值告诉CF替换所有出现的事件。 如果您希望在其他标记之间替换此类的值,请忽略部分。 在这种情况下 ,最好使用正则表达式来避免替换任何内容(不是很高的匹配机会,但你永远不知道):

 ]+?)(class=\""subsubhead\"")([^>]*>)", "\1 id=""#id#"" \2 \3", "All") /> 

这只会在HTML标记中用id="#id#" class="subsubhead" (其中#id#是CF变量的值)替换class="subsubhead"

希望这可以帮助。 这就是ColdFusion快速轻松地完成的事情。

更新:你没有在OP中提到x的值是否需要随每次匹配而增加; 如果是这种情况,那么你将需要使用REFindNoCase()returnsubexpressions=true (使用与上面相同的正则表达式),然后循环遍历lenpos数组:

 ]+?)(class=\""subsubhead\"")([^>]*>)", 1, true) />        

上面可能有一个错误(我没有测试),但我认为它通常是合理的。