2010-11-25 4 views
0

У меня есть сценарий coldfusion, который я некоторое время висел в моей системе управления контентом. Он использует регулярное выражение, чтобы вырезать любые дрянные теги и символы из содержимого.Regex Stripping HTML Tags

Мне нужно остановить этот скрипт от удаления любых <object> и тегов.

Я ухожу, но я думаю, что это за пределами моих навыков регулярного выражения.

http://pastebin.com/rTtMyiQw

<cfparam name="Attributes.allowedclasses" default=""> 

<!--- turn allowed classes list to regular expression ---> 
<cfset Attributes.allowedclasses = Replace(Attributes.allowedclasses, ",", "|", "all")> 

<cfset vBody="<body style='font-family:Verdana; font-size:12px;'>"> 
<cfset vStart="<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'><html xmlns='http://www.w3.org/1999/xhtml' lang='en' xml:lang='en'><head><title>Title</title></head>#vBody#"> 
<cfset vEnd="</body></html>"> 

<cfloop list="#Attributes.varnames#" index="theVariable"> 

    <cfset vIntVar=evaluate("caller.#theVariable#")> 

    <cf_bocctrimformvars varnames="vIntVar" allowhtml="yes" quotes="unescape" allowPound="yes"> 

    <cfset vIntVarDebug=vIntVar> 

    <!--- strip copy and paste word etc code formatting ---> 

    <cfset vIntVar=ReReplaceNoCase(vIntVar, "</?[a-z0-9-=""'!\$\?%&\*\[email protected]~##;,\\]*:[a-z0-9 -=""'!\$\?%&\*\[email protected]~##;,\\]*>", "", "all")> 

    <!--- stop certain classes being stripped out ---> 
    <cfif ListLen(Attributes.allowedclasses) NEQ 0> 
     <cfset vIntVar=ReReplaceNoCase(vIntVar, '<span class="(#Attributes.allowedclasses#)">([\s\S]*?)</span>', '<excludespan classexclude="\1">\2</excludespan>', 'all')> 

     <!--- stop other classes being stripped out ---> 
     <cfset vIntVar=ReReplaceNoCase(vIntVar, '<([a-z0-9]+) class="(#Attributes.allowedclasses#)"[^>]*>', '<\1 classexclude="\2">', 'all')> 
    </cfif> 

    <!--- strip out span and font tags ---> 
    <cfset vIntVar=ReReplaceNoCase(vIntVar, "</?(span|font)[^>]*>", "", "all")> 

    <!--- strip out rest of styles/classes ---> 
    <cfset vIntVar=ReReplaceNoCase(vIntVar, "<([a-z0-9]+) (style|class)=[^>]*>", "<\1>", "all")> 

    <!--- reset classes which shouldn't be stripped out ---> 
    <cfif ListLen(Attributes.allowedclasses) NEQ 0> 
     <cfset vIntVar=ReReplaceNoCase(vIntVar, '<excludespan classexclude="([a-z0-9-]+)"[^>]*>', '<span class="\1">', 'all')> 
     <cfset vIntVar=ReplaceNoCase(vIntVar, '</excludespan>', '</span>', 'all')> 

     <cfset vIntVar=ReReplaceNoCase(vIntVar, '<([a-z0-9]+) classexclude="([a-z0-9-]+)"[^>]*>', '<\1 class="\2">', 'all')> 
    </cfif> 



    <cfset vIntVar=ReReplaceNoCase(vIntVar, "<\?xml[^>]*>", "", "all")> 
    <cfset vIntVar=ReReplaceNoCase(vIntVar, "<p>([[:space:]])*</p>", "", "all")> 
    <cfset vIntVar=ReReplaceNoCase(vIntVar, "</?U>", "", "all")> 
    <cfset vIntVar=ReReplaceNoCase(vIntVar, "</?DIV[^>]*>", "", "all")> 
    <cfset vIntVar=ReReplaceNoCase(vIntVar, "</?PRE>", "", "all")> 
    <cfset vIntVar=ReplaceNoCase(vIntVar, 'target=""', '', 'all')> 

    <!--- 
    DG 19/9/2004: fix put in to swap round <p> and <a> tags if a single <p> is inside an <a> 
    (which html tidy doesn't like 
    ---> 
    <cfset vIntVar=ReReplaceNoCase(vIntVar, "<a([[:print:]]*)>[[:space:]]*<p>([[:print:]]*)</p>([[:space:]]*)</a>", "<p><a\1>\2</a></p>", 'all')> 

    <cfset vIntVar=vStart & vIntVar & vEnd> 

    <cflock name="tidy" type="exclusive" timeout="10"> 
     <cfscript> 
     TidyObj = CreateObject("COM", "TidyCOM.TidyObject"); 
     TidyOptions = TidyObj.Options; 
     TidyOptions.Doctype = "omit"; 
     TidyOptions.TidyMark = false; 
     TidyOptions.OutputXml = false; 
     TidyOptions.InputXml = false; 
     TidyOptions.OutputXhtml = true; 
     TidyOptions.ShowWarnings = false; 
     TidyOptions.DropEmptyParas = true; 
     TidyOptions.Quiet = true; 
     TidyOptions.Indent = 0; 
     TidyOptions.Wrap = 0; 
     TidyOptions.QuoteAmpersand = true; 

     vIntVar = TidyObj.TidyMemToMem(vIntVar); 

     TidyObj = ""; 
     </cfscript> 
    </cflock> 


    <!--- strip any image tags inserted by drag and drop etc ---> 
    <cfset vIntVar=ReReplaceNoCase(vIntVar, "<img [^>]*>", "", "all")> 


</cfloop> 
+1

Я должен предупредить вас, задавая вопросы с парсинг-html-с-регулярным выражением, как правило, немного нахмурился здесь: см. Это: http://stackoverflow.com/questions/1732348/regex-match-open-tags- except-xhtml-self-contains-tags/1732454 # 1732454 –

+0

Я понимаю, что он не популярен. Это старый сценарий. Вместо того, чтобы переписывать все это, мне просто нужно быстро исправить это. – Sam

+2

Серьезно? Вам нужно, по крайней мере, выполнить работу по определению того, где в коде, который вы предоставили, вырезаете теги, о которых идет речь. Тогда кто-то может быть склонен ответить на ваш вопрос. – orangepips

ответ

1

Я согласен с orangepips, вы должны задать более конкретный вопрос, но я также как вызов. Я пробовал синтаксический анализ HTML на REGEX раньше и могу засвидетельствовать, что это нехорошее решение, особенно если вы смотрите на целый документ, а не просто на строку. Однако иногда вам приходится работать с ограниченным пространством, и у вас не так много вариантов.

Я просмотрел все выражения REGEX, которые у вас есть, и провел их все против следующего тега объекта. Ни один из них не обнаружил тег объекта, который заставляет меня думать, что проблема может быть в TidyCOM. Я немного искал информацию о TidyCOM, и самые последние вещи, которые я мог найти, были примерно с 2001 года.

Я понимаю, что вы просто хотите исправить этот сценарий и двигаться дальше, но это может быть невозможно. Вы можете начать думать о переносе этого старого материала на более современную платформу.

Если вы хотите точно узнать, где проблема выдает переменную vIntVar в текстовый файл после объединения vStart, vIntVar и vEnd. Конечно, вы могли бы просто использовать отладчик CF, но, как я могу вспомнить, это было не самое простое для работы.

Объект Тег Я использовал для тестирования выражений:

<object classid="clsid:F08DF954-8592-11D1-B16A-00C0F0283628" id="Slider1" width="100" height="50"> 
    <param name="BorderStyle" value="1" /> 
    <param name="MousePointer" value="0" /> 
    <param name="Enabled" value="1" /> 
    <param name="Min" value="0" /> 
    <param name="Max" value="10" /> 
</object> 

Если вам нужна помощь в понимании того, что выражения Regex делают я нашел Expresso быть отличным инструментом. Есть и другие, но это тот, который я использовал годами, и он выполняет свою работу.

+0

Похоже, я вставил полный код вместо моей урезанной версии. Я потратил большую часть пятницы на работу над этим и заработал все это. Я удалил TidyCOM и проделал работу с каким-то обычным регулярным выражением, которое отлично работает. Я уверен, что для более сложных манипуляций есть другие методы, которые более подходят, но, как вы сказали, иногда вам приходится работать в трудных местах. Я думаю, что ты ударил ноготь по голове этим Райаном, спасибо за твою помощь. – Sam