jquery - coldfusion agrega una identificación a ciertas clases
regex coldfusion-9 (4)
¿Puede el fragmento HTML en cuestión ser casta a un documento XML (necesita tener un nodo raíz y ser compatible con XML). Si puede, puede usar XPath o XQuery en el objeto resultante en ColdFusion para obtener todos los elementos con un valor de "subsubhead" en el atributo de clase y luego cambiar los valores de los atributos en consecuencia y luego volver a escribir en una cadena. Ejemplo a continuación:
<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>
Recuerde en el ejemplo anterior para eliminar el nodo raíz del fragmento antes de volver a escribir.
Actualmente tengo un montón de HTML almacenado en una variable que estoy generando en la página que se parece un poco a esto:
<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>
entiendes la idea
y sale como:
<cfoutput>
#request.oEntry.getHTMLStuff()#
</cfoutput>
De todos modos, necesito encontrar todas las clases de "subsubhead" y agregar un id = "x" donde x corresponde a un id de base de datos que tengo para ese subtítulo.
Creo que esto se haría mejor en Coldfusion ya que la identificación de la base de datos ya está contenida en un cfquery y no puedo mezclar y combinar jQuery y ColdFusion.
Actualmente no estoy seguro de la mejor manera de hacer esto.
Como le gusta jQuery pero necesita hacer esto en CF, le sugiero que haga este trabajo con el analizador HTML JSOUP . JSOUP tiene sintaxis que es muy similar a jQuery, pero opera en el lado del servidor con java (y por lo tanto CF). Después de descargar el jar y agregarlo a su classpath CF, puede usarlo así:
<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>
Esto produce:
<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>
La forma en que estoy asignando los valores de id (mediante la verificación de los contenidos de la etiqueta p) a instancias particulares de subsubhead es solo una opción; también podría hacer algo como hacer coincidir el elemento de respaldo con su consulta de base de datos en función del orden de cada uno (el orden del elemento en el conjunto y el orden del ID en la consulta). Tu decides.
Este es el código que se me ocurrió.
<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>
Esto funciona para mí, pero podría haber una mejor manera
Puede intentar lo siguiente. No creo que necesites una expresión regular:
<cfset html_content = replaceNoCase(request.oEntry.getHTMLStuff(), "<p class=""subsubhead""", "<p id=""#id#"" class=""subsubhead""", "All" />
<cfoutput>#html_content#</cfoutput>
Tenga en cuenta las dobles comillas dobles dentro de las comillas dobles para que las cadenas no se rompan. El valor del parámetro final para replaceNoCase()
le dice a CF que reemplace todas las ocurrencias. Omita la parte <p
si también está buscando reemplazar los valores de esta clase por otras etiquetas. En ese caso, puede ser aconsejable usar una expresión regular para evitar reemplazar cualquier contenido (no hay una gran probabilidad de que coincida, pero nunca se sabe):
<cfset html_content = REReplaceNoCase(request.oEntry.getHTMLStuff(), "(<[^>]+?)(class=/""subsubhead/"")([^>]*>)", "/1 id=""#id#"" /2 /3", "All") />
Esto solo reemplazará la class="subsubhead"
con id="#id#" class="subsubhead"
(donde #id#
es el valor de una variable CF) en etiquetas HTML.
Espero que esto ayude. Este es el tipo de cosas que ColdFusion hace rápida y fácilmente.
ACTUALIZACIÓN: No mencionó en el OP si el valor de x
necesita incrementarse con cada coincidencia; si ese es el caso, entonces querrá usar REFindNoCase()
con returnsubexpressions=true
(usando la misma expresión regular que antes), y luego recorrer las matrices len
y 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>
Puede haber un error de apagado por uno en el anterior (no lo hice), pero creo que en general es bueno.