coldfusion为某些类添加id

时间:2012-03-19 14:22:45

标签: jquery regex coldfusion coldfusion-9

目前我有一堆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。

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

4 个答案:

答案 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一起使用(使用与上面相同的正则表达式),然后循环遍历lenpos数组:

<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>

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