2012-03-19 1 views
2

에 ID를 추가합니다.ColdFusion은 현재 내가 이런 작은 보이는 페이지를 출력하고 변수에 저장 HTML의 무리가 특정 클래스

이며 출력은 같은 : 어쨌든

<cfoutput> 
#request.oEntry.getHTMLStuff()# 
</cfoutput> 

, 나는 "subsubhead"의 모든 클래스를 찾을 수 x는 내가 그 소제목을 위해이 데이터베이스 ID에 해당하는 ID = "X"에 추가해야합니다.

데이터베이스 아이디가 이미 cfquery에 저장되어 있고 jQuery와 ColdFusion을 혼합하고 일치시킬 수 없기 때문에 이것이 Coldfusion에서 가장 잘 된 것 같습니다.

현재이 작업을 수행하는 가장 좋은 방법은 아닙니다.

+0

이미 ColdFusion 쿼리에서 HTML을 생성하고있는 것 같습니다. 어떤 경우 CF 코드를 게시하거나 HTML이 어떻게 생성되는지 설명 할 수 있습니까? –

+3

SQL, jQuery 또는 ColdFusion에서 작업하길 원하십니까? 실제로 저장된 데이터를 변경 하시겠습니까, 아니면 일단 브라우저에 도달하면 변경 하시겠습니까? –

+0

HTML은 기본적으로 누군가가 단어의 텍스트 영역에 복사하여 붙여 넣은 데이터베이스에서 나옵니다. Evik, 나는 ColdFusion이 부제 ID가 이미 variables.qsubheading에 저장되어 있기 때문에 작업을해야한다고 생각합니다. – Jarede

답변

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()'를 사용할 수 있습니다. –

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

jQuery를 좋아하지만 CF에서이 작업을 수행해야하므로 HTML 구문 분석기 JSOUP으로이 작업을 수행하는 것이 좋습니다. JSOUP에는 jQuery와 매우 유사한 구문이 있지만 java (따라서 CF)와 함께 서버 측에서 작동합니다. 당신이 항아리를 다운로드하여 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의 순서)를 기반으로 데이터베이스 백업과 일치하는 것과 같은 것을 할 수 있습니다. 그것은 당신에게 달려 있습니다.

+0

나는이 솔루션을 좋아하지만 설치하고 테스트 할 수있는 시간이 없다. 그래서 대답으로 표시 할 수 없다. 나는 그것이 다른 사람들을 돕기를 바랍니다. – Jarede

+0

설치 시간? 이를 설치하기 위해서는 .jar 파일을 다운로드하고 CF 관리자 (Java 설정 아래)의 클래스 경로에 추가하십시오. 그런 다음 CF를 다시 시작하십시오. –

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#은 HTML 태그의 CF 변수 값입니다.

희망이 도움이됩니다. 이것은 ColdFusion이 빠르고 쉽게하는 일종의 것입니다.

업데이트 :x의 값이 매치마다 증가해야하는지 여부는 OP에서 언급하지 않았습니다.

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

는 하나 개의 이상에 의한 오프가있을 수 있습니다 : 이런 경우에, 당신은 lenpos 배열을 통해 반복 한 후, (위와 같은 정규식을 사용하여) returnsubexpressions=trueREFindNoCase()를 사용하는 것이 좋습니다 위의 (나는 테스트하지 않았다),하지만 나는 그것이 일반적으로 소리라고 생각한다.