2012-03-19 36 views
2

目前,我有存储在我输出到,看起来有点像这样的页面变量一串HTML的:ColdFusion的添加ID某些类

<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

听起来好像您是从ColdFusion查询中生成HTML的。任何机会你可以张贴一些CF代码或解释如何生成HTML? – 2012-03-19 14:32:07

+3

你想要SQL,jQuery或ColdFusion来完成这项工作吗?你是否真的想改变存储的数据,或者只是在浏览器中改变它? – 2012-03-19 14:33:49

+0

HTML来自数据库,其中有人已经基本上将其复制并粘贴到文字区域。 Evik,我认为ColdFusion将不得不做这项工作,因为子标题id已经存储在variables.qsubheading而不是页面上的输入 – Jarede 2012-03-19 14:38:01

回答

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> 

这对我的作品,但有可能是一个更好的办法

+2

上面没有理由在上面使用'REFind()',因为你不是试图匹配正则表达式模式 - 您可以简单地使用find()或findNoCase()。 – 2012-03-21 13:19:29

1

有问题的HTML片段可以是种姓XML文档(它需要有一个根节点是XML符合性)。如果可以的话,您可以在ColdFusion中的结果对象上使用XPath或XQuery,以便在类属性中获取所有具有“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

既然你喜欢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标签内容)到subsubhead的特定实例只是一种选择;您还可以根据每个元素(数组中元素的顺序和查询中ID的顺序)执行一些操作,例如将元素与数据库查询进行备份。随你便。

+0

我喜欢这个解决方案,但是我没有时间去安装和测试,所以我不能把它当作答案。我希望它能帮助其他人。 – Jarede 2012-03-20 09:58:11

+0

安装时间?您只需下载.jar文件并将其添加到CF管理员的类路径中(在Java设置下)即可。然后重新启动CF. – 2012-03-20 18:36:08

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> 

有可能是一个错误在关闭以上(我没有测试),但我认为这是一般的声音。