Удаление определенных тегов HTML с CFML - PullRequest
0 голосов
/ 23 мая 2018

Мне нужно регулярное выражение, чтобы удалить все экземпляры <FONT> и любые свойства, которые могут быть внутри него, такие как <FONT size=2 face=Verdana> и закрывающий тег </FONT>.возвращаемая строка, тег font может содержать любое свойство и различные варианты значений для этих свойств, а структура html не согласована.это один из примеров того, что я получаю в виде строки:

<UL>
    <LI><FONT size=2 face=Verdana>random text<STRONG>random text</STRONG>random text<SPAN style="LINE-HEIGHT: 115%; FONT-FAMILY: 'Arial','sans-serif'; FONT-SIZE: 11pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>random text</SPAN> </FONT></LI>
    <LI><FONT size=2 face=Verdana><FONT size=2 face=Verdana><STRONG>random text</STRONG></FONT></LI> <LI>random text</FONT></LI>
    <LI><FONT size=2 face=Verdana>random text</FONT></LI>
    <LI><FONT size=2 face=Verdana>random text</FONT></LI>

, и вот как я хотел бы, чтобы это выглядело после использования регулярного выражения:

<UL>
    <LI>random text<STRONG>random text</STRONG>random text<SPAN style="LINE-HEIGHT: 115%; FONT-FAMILY: 'Arial','sans-serif'; FONT-SIZE: 11pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>random text</SPAN></LI>
    <LI><STRONG>random text</STRONG></LI>
    <LI>random text</LI>
    <LI>random text</LI>
    <LI>random text</LI>

Я пробовал разныевариантов, и я смог удалить часть <FONT, но не ее свойства, окончание > или закрывающий тег </FONT>

Это пример того, что я использую

loc.result = rereplace(arguments.htmlString, "\\<FONT[^*\\>", "", "ALL");

Я прошу прощения за мой плохой код регулярного выражения, поэтому любые советы или предложения будут с благодарностью!

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Как уже писали другие, не используйте для этого REGEX.Используйте HTML-анализатор, такой как JSoup.

Загрузите файл JSoup jar и сохраните его где-нибудь на вашем пути к классам, а затем используйте следующую функцию (синтаксис cfscript, протестированный с Lucee , но должен работать с любым механизмом CFML):

<cfscript>
/** removes the given tag from the input html while keeping its contents */ 
function removeTag(input, tagname){

    var Jsoup = createObject("java", "org.jsoup.Jsoup");
    var doc   = Jsoup.parse(arguments.input);
    var body  = doc.body().child(0);
    var tags  = body.select(arguments.tagname);

    for (var tag in tags){
        for (var attr in tag.attributes().asList())
            tag.removeAttr(attr.getKey());
    }

    var result = body.toString();
    result = replace(result, "<#arguments.tagname#>",  "", "all");
    result = replace(result, "</#arguments.tagname#>", "", "all");

    return result;
}
</cfscript>

Затем просто вызовите функцию с кодом HTML, который вы хотите очистить, например:

cleanHtml = removeTag(inputHtml, "font");

Чтобы проверить ваш примерЯ добавил следующее:

<cfsavecontent variable="input">
<UL>
    <LI><FONT size=2 face=Verdana>random text 1<STRONG>random text 2</STRONG>random text 3<SPAN style="LINE-HEIGHT: 115%; FONT-FAMILY: 'Arial','sans-serif'; FONT-SIZE: 11pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>random text 4</SPAN> </FONT></LI>
    <LI><FONT size=2 face=Verdana><FONT size=2 face=Verdana><STRONG>random text 5</STRONG></FONT></LI> <LI>random text 5</FONT></LI>
    <LI><FONT size=2 face=Verdana>random text 6</FONT></LI>
    <LI><FONT size=2 face=Verdana>random text 7</FONT></LI>
</cfsavecontent>

<cfdump var="#{ output: removeTag(input, "font"), input: input }#">

И вывод выглядит следующим образом:

enter image description here

Рекомендую также прочитать мой пост в блоге Использование возможностей Java в CFML

0 голосов
/ 23 мая 2018

Regex можно сделать так: <\/?FONT.*?> ( test и example ).

Но в целом не используйте regex для анализа HTML / XML .И вот почему: https://stackoverflow.com/a/1732454/2610466

ОБНОВЛЕНИЕ : Исправлен ответ в соответствии с лучшим пониманием вопроса

...