Вы можете попробовать следующее. Я не думаю, что вам даже нужно регулярное выражение:
<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>
В приведенном выше сообщении может быть отключена одна ошибка (я не проверял), но я думаю, что это в целом нормально.