目前我有一堆HTML存储在一个变量中,我输出到的页面看起来有点像这样:
<p class="firstpara">some stuff</p>
<p class="subhead">a heading</p>
<p class="subsubhead">a subheading</p>
<p>wording and such</p>
<p class="subsubhead">another subheading</p>
你明白了。
并输出如:
<cfoutput>
#request.oEntry.getHTMLStuff()#
</cfoutput>
无论如何,我需要找到所有“subsubhead”类并添加一个id =“x”,其中x对应于我对该子标题的数据库ID。
我认为这最好在Coldfusion中完成,因为数据库ID已经存在于cfquery中,我无法混合和匹配jQuery和ColdFusion。
目前还不确定最好的方法。
答案 0 :(得分:2)
既然您喜欢jQuery但需要在CF中执行此操作,我建议您使用HTML解析器JSOUP来完成此工作。 JSOUP的语法与jQuery非常相似,但在服务器端使用java(以及CF)进行操作。下载jar并将其添加到CF类路径后,您可以像这样使用它:
<cfset jsoup = CreateObject("java", "org.jsoup.Jsoup")>
<cfsavecontent variable="html">
<p class="firstpara">some stuff</p>
<p class="subhead">a heading</p>
<p class="subsubhead">a subheading</p>
<p>wording and such</p>
<p class="subsubhead">another subheading</p>
</cfsavecontent>
<cfset htmlObj = jsoup.parse(html)>
<cfloop array="#htmlObj.select('.subsubhead')#" index="element">
<cfif Find("a subheading", element.ownText())>
<cfset element.attr("id", 1)>
</cfif>
<cfif Find("another subheading", element.ownText())>
<cfset element.attr("id", 2)>
</cfif>
</cfloop>
<cfoutput>
<pre>
#HTMLEditFormat(htmlObj.body().html())#
</pre>
</cfoutput>
输出:
<p class="firstpara">some stuff</p>
<p class="subhead">a heading</p>
<p class="subsubhead" id="1">a subheading</p>
<p>wording and such</p>
<p class="subsubhead" id="2">another subheading</p>
我将id值(通过检查p标签内容)分配给子标题的特定实例的方式只是一种选择;您还可以根据每个元素的顺序(数组中元素的顺序和查询中id的顺序)将元素与数据库查询匹配。它取决于你。
答案 1 :(得分:1)
有问题的HTML片段是否可以适应XML文档(它需要具有根节点并且符合XML标准)。如果可以的话,你可以在ColdFusion中的结果对象上使用XPath或XQuery来获取class属性中值为“subsubhead”的所有元素,然后相应地更改属性值,然后写回字符串。示例如下:
<cfxml variable="htmlFragment">
<fragment>
<p class="firstpara">some stuff</p>
<p class="subhead">a heading</p>
<p class="subsubhead">a subheading</p>
<p>wording and such</p>
<p class="subsubhead">another subheading</p>
</fragment>
</cfxml>
<cfset subheads = XmlSearch(htmlFragment, "//p[@class=""subsubhead""]")>
<cfloop array=#subheads# index="p">
<cfset p.XmlAttributes.class = "newvalue">
</cfloop>
请记住,在上面的示例中,在写回之前删除片段根节点。
答案 2 :(得分:0)
这是我提出的代码。
<cfscript>
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);
</cfscript>
这对我有用,但可能有更好的方式
答案 3 :(得分:0)
您可以尝试以下方法。我认为你甚至不需要正则表达式:
<cfset html_content = replaceNoCase(request.oEntry.getHTMLStuff(), "<p class=""subsubhead""", "<p id=""#id#"" class=""subsubhead""", "All" />
<cfoutput>#html_content#</cfoutput>
注意双引号内的双引号,这样字符串就不会破坏! replaceNoCase()
的最终参数值告诉CF替换所有出现的事件。如果您要在其他代码中替换此类的值,请忽略<p
部分。建议在这种情况下使用正则表达式来避免替换任何内容(不是很有可能匹配,但你永远不知道):
<cfset html_content = REReplaceNoCase(request.oEntry.getHTMLStuff(), "(<[^>]+?)(class=\""subsubhead\"")([^>]*>)", "\1 id=""#id#"" \2 \3", "All") />
这只会将class="subsubhead"
替换为id="#id#" class="subsubhead"
(其中#id#
是CF变量的值)。
希望这会有所帮助。这就是ColdFusion快速轻松地做到的事情。
更新:您没有在OP中提及x
的值是否需要随每次匹配而增加;如果是这种情况,那么您需要将REFindNoCase()
与returnsubexpressions=true
一起使用(使用与上面相同的正则表达式),然后循环遍历len
和pos
数组:
<cfset content_match = REFindNoCase(request.oEntry.getHTMLStuff(), "(<[^>]+?)(class=\""subsubhead\"")([^>]*>)", 1, true) />
<cfloop from="1" to="#arrayLen(content_match.pos)#" index="ii">
<!--- Do the replace in here --->
<cfset temp = mid(content_match, pos[ii], len[ii]) />
<cfset temp = replaceNoCase(temp, "class=""subsubhead""", "id=""#ii#"" class=""subsubhead""") />
<cfset content_match = removeChars(content_match, pos[ii], len[ii]) />
<cfset content_match = insert(temp, content_match, pos[ii]) />
</cfloop>
上面可能有一个错误(我没有测试),但我认为它通常是合理的。