coldfusion добавить идентификатор для определенных классов - PullRequest
2 голосов
/ 19 марта 2012

В настоящее время у меня есть куча 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>

В любом случае, мне нужно найти все классы "sububhead" и добавить id = "x", где x соответствует идентификатору базы данных, который у меня есть для этого подзаголовка.

Я думаю, что это лучше всего сделать в Coldfusion, поскольку идентификатор базы данных уже содержится в cfquery, и я не могу смешивать и сопоставлять jQuery и ColdFusion.

в настоящее время не уверен, лучший способ сделать это.

Ответы [ 4 ]

2 голосов
/ 19 марта 2012

Поскольку вы любите jQuery, но должны делать это на CF, я предлагаю выполнить эту работу с анализатором HTML JSOUP . JSOUP имеет синтаксис, который очень похож на jQuery, но работает на стороне сервера с Java (и, следовательно, CF). После того, как вы скачаете флягу и добавите ее в ваш CF classpath, вы можете использовать ее следующим образом:

<code><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())#
    

Это выводит:

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

Способ назначения значений идентификаторов (посредством проверки содержимого тега p) конкретным экземплярам подзаголовка - всего лишь одна из опций; Вы также можете сделать что-то вроде сопоставления элемента с вашим запросом к базе данных на основе порядка каждого (порядка элемента в массиве и порядка идентификатора в запросе). Это зависит от вас.

1 голос
/ 19 марта 2012

Может ли рассматриваемый фрагмент HTML быть приведенным к документу XML (он должен иметь корневой узел и быть совместимым с XML).Если это возможно, вы можете использовать XPath или XQuery для результирующего объекта в ColdFusion, чтобы получить все элементы со значением «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>

Не забудьте в приведенном выше примере удалить корневой узел фрагмента перед записью.

0 голосов
/ 20 марта 2012

Вы можете попробовать следующее. Я не думаю, что вам даже нужно регулярное выражение:

<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) в тегах HTML.

Надеюсь, это поможет. Это то, что ColdFusion делает быстро и легко.

ОБНОВЛЕНИЕ: Вы не упомянули в ОП, нужно ли увеличивать значение 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>

В приведенном выше сообщении может быть отключена одна ошибка (я не проверял), но я думаю, что это в целом нормально.

0 голосов
/ 19 марта 2012

Это код, который я придумал.

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

Это работает для меня, но, возможно, есть лучший способ

...