ColdFusion 9: удаление HTML-тегов из определенных частей строки - PullRequest
1 голос
/ 01 марта 2012

Я довольно долго ломал голову над этим.

В настоящее время я создаю собственную функцию BB-кода как часть проекта на работе.Но я не заставляю его работать в одном месте: блоке [кода].Используя ColdFusion regex , я хочу заменить символы <</strong> и > на &lt; и &gt;, но только в HTML между блоками [code],Итак, как я могу ограничить выражение регулярного выражения в той части строки, которая находится между блоками [code].Заранее спасибо за любую помощь.

Ответы [ 2 ]

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

Для тех, кто наткнулся на этот вопрос и также может использовать ответ, я приведу пример разбора HTML в блоках [code].Хотя выглядит немного грязно:

<cfset contents = form.yourString />

<cfset substring1= "[code]" />
<cfset occurrences1 = ( Len(contents) - Len(Replace(contents,substring1,"","ALL"))) / Len(substring1) />
<cfset substring2= "[/code]" />
<cfset occurrences2 = ( Len(contents) - Len(Replace(contents,substring2,"","ALL"))) / Len(substring2) />

<cfif occurrences1 EQ occurrences2 AND occurrences1 GT 0 AND occurrences2 GT 0>
  <cfset loopinstance = occurrences1 />
<cfelse>
  <cfif occurrences1 LT occurrences2>
      <cfset loopinstance = occurrences1 />
  <cfelse>
      <cfset loopinstance = occurrences2 />
  </cfif>
</cfif>

<cfloop index="code_loop" from="1" to="#loopinstance#">
  <cfscript>
      // prepare variables //
      code_string = contents; 
      startpos = FindNoCase("[code]", code_string); 
      startpos = Evaluate(startpos + 6); // adjust the correct position of string in question 
      endpos   = FindNoCase("[/code]", code_string); 
      code_string = Mid(code_string, startpos, Evaluate(endpos - startpos)); // extract the string between code brackets 
      //** Replace-Codes are extensible depending on the used programming languages **//
      code_string = ReplaceNoCase(code_string, "<","&lt;", "ALL"); 
      code_string = ReplaceNoCase(code_string, ">","&gt;", "ALL"); 
      //** process conversion of [code] block **//
      startpos = FindNoCase("[code]", contents); // reevaluating the start and end positions for main string 
      startpos = Evaluate(startpos + 6); // adjust the correct position of form string 
      endpos   = FindNoCase("[/code]", contents); 
      contents = RemoveChars(contents, startpos, Evaluate(endpos - startpos)); // remove the extracted string 
      contents = Insert(code_string, contents, Evaluate(startpos - 1)); // insert the processed code block to the original position 
      contents = ReplaceNoCase(contents, "[code]", "[coded]", "ONE"); // "flagging" the processed [code] block as finished by adding a "d" 
      contents = ReplaceNoCase(contents, "[/code]", "[/coded]", "ONE"); // "flagging" the processed [code] block as finished by adding a "d" 
  </cfscript>
</cfloop>

<!--- This is the regex to turn a written [code] block into an escaped HTML block --->
<cfscript>
  contents = REReplaceNoCase(contents, "\[coded\](.*?)\[/coded\]", "<div id =""code_test"">Escaped Code: <br />\1</div>", "ALL"); 
</cfscript>

Я надеюсь, что это поможет некоторым людям, которым трудно следовать за помощью Дэвида Фабера.

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

Я думаю, что в ColdFusion вам придется перебирать строку, ища вхождения "[code]". Когда вы найдете такое вхождение, читайте в строке, пока не нажмете «[/ code]». Возьмите эту строку и сделайте replaceList для замены символов. Используйте функции removeChars и insert, чтобы заменить старую строку новой. Одна из проблем использования регулярных выражений в этом контексте заключается в том, что функция CF REReplace не может заменить шаблон другим шаблоном, а только строкой.

...