Удаление определенных тегов HTML с помощью CFML

Мне нужно регулярное выражение, чтобы удалить все экземпляры <FONT> и любые свойства, которые могут быть внутри него, такие как <FONT size=2 face=Verdana> и его закрывающий тег </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");

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


person Phillip Pantaleano    schedule 23.05.2018    source источник
comment
Вот почему вам не следует использовать регулярное выражение для анализа HTML Link. Сказав это, попробуйте (?:<FONT[^>]*>|<\/FONT>). См. демонстрацию.   -  person Matt.G    schedule 23.05.2018
comment
Я не пытаюсь разобрать html, я просто пытаюсь удалить эти теги шрифта.   -  person Phillip Pantaleano    schedule 23.05.2018
comment
Поместите свой html в объект XML и используйте XPath. Гораздо надежнее, чем использование регулярных выражений. Регулярное выражение сломается при первом запуске html с текстом в html, который является примером кода, показывающего, как использовать тег font (например, внутри тега ‹pre› или ‹code›).   -  person Sam M    schedule 24.05.2018
comment
@SamM Вы действительно собираетесь верить, что HTML тоже является допустимым XML?   -  person James A Mohler    schedule 24.05.2018
comment
@JamesAMohler Ты прав, но всегда можно надеяться. Думаю, я бы не стал задерживать дыхание, хотя html является допустимым xml, если html настолько стар, что все еще использует тег шрифта. ;)   -  person Sam M    schedule 24.05.2018


Ответы (2)


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

Загрузите jar-файл JSoup и сохраните его где-нибудь в пути к классам, а затем используйте следующую функцию (синтаксис 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 }#">

И вывод следующий:

введите здесь описание изображения

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

person isapir    schedule 24.05.2018
comment
Не хватает jQuery. - person Phillip Senn; 24.05.2018

Регулярное выражение можно сделать так: <\/?FONT.*?> (тест и пример).

Но в целом не используйте регулярное выражение для синтаксического анализа HTML/XML. Вот почему: https://stackoverflow.com/a/1732454/2610466

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

person Krypt1    schedule 23.05.2018