2012-03-19 2 views
2

Actuellement, j'ai un tas de HTML stocké dans une variable que je suis fournir en sortie à la page qui ressemble un peu à ceci:coldfusion ajouter un identifiant à certaines classes

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

vous voyez l'idée.

et est sortie comme:

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

Quoi qu'il en soit, je dois trouver toutes les classes de « subsubhead » et ajouter dans un id = « x » où x correspond à un identifiant de base de données que j'ai pour cette sous-position.

Je pense que cela serait mieux fait dans Coldfusion puisque l'identifiant de la base de données est déjà détenu dans une requête cf et que je ne peux pas mélanger et faire correspondre jQuery et ColdFusion.

pas actuellement sûr de la meilleure façon de le faire.

+0

Il semble que vous générez déjà le code HTML à partir d'une requête ColdFusion. Y a-t-il une chance que vous puissiez poster du code CF ou expliquer comment le code HTML est généré? –

+3

Voulez-vous que SQL, jQuery ou ColdFusion fasse le travail? Voulez-vous réellement changer les données qui sont stockées ou juste le changer une fois qu'il atteint le navigateur? –

+0

HTML provient de la base de données où quelqu'un l'a copié et collé dans une zone de texte à partir d'un mot. Evik, je pense que ColdFusion va devoir faire le travail puisque l'identifiant de sous-titre est déjà stocké dans variables.qsubheading plutôt que dans les entrées sur la page – Jarede

Répondre

0

C'est le code que j'ai imaginé.

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

Cela fonctionne pour moi, mais il pourrait y avoir une meilleure façon

+2

Il n'y a aucune raison d'utiliser REFind() 'dans ce qui précède puisque vous n'êtes pas essayer de faire correspondre un modèle d'expression régulière - vous pouvez simplement utiliser 'find()' ou 'findNoCase()'. –

1

peut le fragment HTML en question soit caste à un document XML (il doit avoir un nœud racine et être en charge XML). Si c'est possible, vous pouvez utiliser XPath ou XQuery sur l'objet résultant dans ColdFusion pour obtenir tous les éléments avec la valeur "subsubhead" dans l'attribut class, puis modifier les valeurs d'attribut en conséquence et ensuite réécrire en une chaîne. Exemple ci-dessous:

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

N'oubliez pas dans l'exemple ci-dessus de supprimer le noeud racine du fragment avant de réécrire.

2

Puisque vous aimez jQuery mais devez le faire dans CF, je suggère de faire ce travail avec l'analyseur HTML JSOUP. JSOUP a une syntaxe qui est très similaire à jQuery, mais fonctionne du côté serveur avec java (et donc CF). Après avoir téléchargé le pot et l'ajouter à votre CF classpath, vous pouvez alors l'utiliser comme ceci:

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

Ce sorties:

<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 façon dont je suis attribuer des valeurs d'identité (via la vérification de la p étiquette contenu) à des instances particulières de sous-tête est mais une option; vous pouvez également faire quelque chose comme faire correspondre l'élément avec votre requête de base de données en fonction de l'ordre de chacun (l'ordre de l'élément dans le tableau et l'ordre de l'id dans la requête). C'est à vous.

+0

J'aime cette solution mais je n'ai pas le temps de pouvoir l'installer et de la tester Donc je ne peux pas vraiment marquer comme la réponse. J'espère que ça aide d'autres personnes. – Jarede

+0

Il est temps d'installer? Tout ce que vous avez à faire pour l'installer est de télécharger le fichier .jar et de l'ajouter à votre classpath dans CF Administrator (sous Paramètres Java). Puis redémarrez CF. –

0

Vous pourriez essayer ce qui suit. Je ne pense pas que vous avez même une expression régulière:

<cfset html_content = replaceNoCase(request.oEntry.getHTMLStuff(), "<p class=""subsubhead""", "<p id=""#id#"" class=""subsubhead""", "All" /> 
<cfoutput>#html_content#</cfoutput> 

Notez les doubles guillemets doubles à l'intérieur des guillemets doubles de sorte que les chaînes ne se cassent pas! La valeur finale du paramètre replaceNoCase() indique à CF de remplacer toutes les occurrences. Omettez la partie <p si vous cherchez à remplacer les valeurs de cette classe par d'autres balises.Il pourrait être souhaitable dans ce cas d'utiliser une expression rationnelle pour éviter de remplacer tout contenu (pas une grande chance d'un match, mais on ne sait jamais):

<cfset html_content = REReplaceNoCase(request.oEntry.getHTMLStuff(), "(<[^>]+?)(class=\""subsubhead\"")([^>]*>)", "\1 id=""#id#"" \2 \3", "All") /> 

Cela ne remplacera le class="subsubhead" avec id="#id#" class="subsubhead" (où #id# est la valeur d'une variable CF) dans les balises HTML.

Espérons que cela aide. C'est le genre de chose que ColdFusion fait rapidement et facilement.

MISE À JOUR: Vous n'avez pas mentionné dans l'OP si la valeur de x doit être incrémentée à chaque correspondance; si tel est le cas, alors vous aurez envie d'utiliser REFindNoCase() avec returnsubexpressions=true (en utilisant la même regex comme ci-dessus), en boucle puis à travers les len et pos tableaux:

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

Il pourrait y avoir un arrêt par une erreur ci-dessus (je n'ai pas testé), mais je pense que c'est généralement sain.

Questions connexes