Как с помощью с# закрыть все html теги

keltuzhaknut

Client
Регистрация
24.02.2016
Сообщения
221
Благодарностей
3
Баллы
18
К примеру сгенирировался текст, но там есть не закрытые теги.. их нужно закрыть, как с помощью с# это реализовать?
<p><p> к примеру два открытых, нужно их закрыть или div контейнер или strong, b, i, li, ul и т.д.?
 

Nord

Client
Регистрация
22.03.2012
Сообщения
2 405
Благодарностей
1 471
Баллы
113
Как коду понять где закрывать тег?
 

keltuzhaknut

Client
Регистрация
24.02.2016
Сообщения
221
Благодарностей
3
Баллы
18
По первому попавшему тегу, к примеру взял тег p - ишет первый /p нашел берет следующий, и т.д.
 

Nord

Client
Регистрация
22.03.2012
Сообщения
2 405
Благодарностей
1 471
Баллы
113
По первому попавшему тегу, к примеру взял тег p - ишет первый /p нашел берет следующий, и т.д.
То есть в тексте везде стоят конструкции со слешем типа "/p"? Ну тогда просто через замену
Или просто надо наугад влипить закрывающие?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 641
Баллы
113
То есть в тексте везде стоят конструкции со слешем типа "/p"? Ну тогда просто через замену
Или просто надо наугад влипить закрывающие?
он имел ввиду, что, если, например, есть два подряд открытых тега, а закрыт только один - закрыть второй сразу после 1го. Но всё это только один из хреналиона возможных вариантов расположения. Продумать логику под это всё мне кажется совсем не просто будет
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 641
Баллы
113
можео попробовать такой хтмл скормить какому-нибдь хтмл агилити паку. Может он сам всё проставит, когда будет дерево собирать
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
Походу просто нужно заменить все нечетные совпадения по регулярке (<)(?!br)(\w+>) на $1/$2
В коде что-то не получилось придумать, как это реализовать, поэтому решил воспользоваться обычным кубиком замены. Но тут тоже облом:-) - при замене по диапазону (для нечетных совпадений - oddAll), замена происходит на текст $1/$2, а не на значения переменных $1 и $2
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
У браузеров есть такая вещь, как синтаксический и лексический анализатор. Неправильные теги они закрывают по списку специальных правил, но чтобы это все изучить тебе придется довольно много всего изучить, так что твоя задача не стоит свеч.
 

keltuzhaknut

Client
Регистрация
24.02.2016
Сообщения
221
Благодарностей
3
Баллы
18
Дело в том, что нужно для импорта текста, если теги не закрытые, то импорт происходит с ошибкой, точнее запись отображается после обновления записи в ручную, когда вордпрес сам правит не закрытые теги.. Объем записей очень большой..
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Я могу попросить своего знакомого, который опытнее меня в раз 10 минимум, но не факт, что у него будет свободное время и ценник может кусаться (точно не знаю). Но если он делает, то делает по высочайшему разряду
 

budora

Client
Регистрация
13.08.2012
Сообщения
831
Благодарностей
556
Баллы
93
Дело в том, что нужно для импорта текста, если теги не закрытые, то импорт происходит с ошибкой, точнее запись отображается после обновления записи в ручную, когда вордпрес сам правит не закрытые теги.. Объем записей очень большой..
Добавьте сюда исходный материал для примера. Если и есть желающие поломать копья, то отсутствие примера для работы многих остановит.
Создавать ещё и текст с незакрытыми тегами будет просто лениво.
 
  • Спасибо
Реакции: samsonnn и Dimionix

keltuzhaknut

Client
Регистрация
24.02.2016
Сообщения
221
Благодарностей
3
Баллы
18
Код:
[shortc2ode]<div id="opawumaci"><a href="#">Dr lee fantasy carnage</a>
<h1>Dr lee fantasy carnage</h1>
<img src="http://sites.com/wp-content/uploads/photos/dr-lee-fantasy-carnage.jpg" width="565" height="548" alt="dr lee fantasy carnage" style="float: left;" title="dr lee fantasy carnage">
<ul><li>Mars venus funny pictures with quotes for ocd</li><li>Geometric definition biology for.</li></ul></div>[/shortc2ode]
[shortcode]<div align="center"><iframe src="http://www.freeonlinegames.com/embed/24600" width="640" height="480" frameborder="no" scrolling="no"></iframe></div>
<h2 style="text-align: center;">Description:</h2>
<p><p><p> </p> <p>In Dr Lee''s Fantasy Carnage, play the</strong> role of Dr Lee in this excellent run and gun, <b>alience shoot ''em up game</b>. Shoot the aliens and their</b> carriers <b>to unlock new guns and ammo and cause extreme amounts of carnage. Survive the many waves of enemies now!
</p> </p></p>
<h2 style="text-align: center;">Instructions:</h2>
<p><p><p><iframe src="http://www.veedi.com/player/notfoundframe.php" allowfullscreen="true" scrolling="no" id="Veediframe" style="transition: all 0.3s ease-in-out 0s; display: block; margin: auto; overflow: hidden; background-color: black; background-image: url(&quot;http://www.veedi.com/player/img/original-loader_orig_2.gif&quot;); background-position: center center; background-repeat: no-repeat; visibility: visible;" frameborder="0" height="0" width="0"></iframe>
</p><p><p> </p>
<p>AD - Move left and right. W - Jump. <strong>Mouse - Aim. Left Click - Shoot. </p>
</p></p><p>[/shortcode]
 

freeman

Client
Регистрация
31.07.2010
Сообщения
130
Благодарностей
138
Баллы
43
HtmlAgilityPack умеет чинить невалидный html код, закрывать незакрытые тэги, удалять закрывающие тэги (если нет открывающих тэгов).
 
  • Спасибо
Реакции: keltuzhaknut

keltuzhaknut

Client
Регистрация
24.02.2016
Сообщения
221
Благодарностей
3
Баллы
18

freeman

Client
Регистрация
31.07.2010
Сообщения
130
Благодарностей
138
Баллы
43
Добавить в шаблон инструмент Ссылки из GAC, там подключить библиотеку HtmlAgilityPack.dll и сборку System.Xml.dll. Первая библиотека есть в прикрепленном архиве, его нужно куда-нибудь распаковать и выбрать файл через кнопку Обзор. Вторая библиотека является частью .net и выбирается через фильтр. Далее нужно добавить в шаблон экшн C# код и скопировать туда этот код.
Код:
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(project.Variables["html"].Value);
project.Variables["html"].Value = doc.DocumentNode.OuterHtml;
Сам невалидный html код должен лежать в переменной html. После обработки результат будет помещен в эту же переменную.
 

Вложения

  • Спасибо
Реакции: keltuzhaknut

keltuzhaknut

Client
Регистрация
24.02.2016
Сообщения
221
Благодарностей
3
Баллы
18
Добавить в шаблон инструмент Ссылки из GAC, там подключить библиотеку HtmlAgilityPack.dll и сборку System.Xml.dll. Первая библиотека есть в прикрепленном архиве, его нужно куда-нибудь распаковать и выбрать файл через кнопку Обзор. Вторая библиотека является частью .net и выбирается через фильтр. Далее нужно добавить в шаблон экшн C# код и скопировать туда этот код.
Код:
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(project.Variables["html"].Value);
project.Variables["html"].Value = doc.DocumentNode.OuterHtml;
Сам невалидный html код должен лежать в переменной html. После обработки результат будет помещен в эту же переменную.
Благодарю. Сделал, но что-то не так http://joxi.ru/BA0N0jNTBM87qm
Пример, того что получилось:
</p><p>sdfsdfsdf sdf</p><p> - это было перед запуском в переменной, стало после обработки блока c# - <p><p>sdfsdfsdf sdf</p><p>

http://joxi.ru/Vm6lxLltx4WdPA

Пробовал по очереди добавлять каждый - http://joxi.ru/L214zQ4C6RNyem - что-то не так..
 

freeman

Client
Регистрация
31.07.2010
Сообщения
130
Благодарностей
138
Баллы
43
Тут, скажем так, задача не из простых. В случае, когда есть закрывающий тэг, но отсутствует открывающий, определить место, где он должен находиться - невозможно. Можно попробовать этот код, но не факт, что он будет открывать/закрывать тэги именно там, где нужно.
Код:
HtmlAgilityPack.HtmlNode.ElementsFlags["p"] = HtmlAgilityPack.HtmlElementFlag.Closed;
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(project.Variables["html"].Value);
project.Variables["html"].Value = doc.DocumentNode.OuterHtml;
 
  • Спасибо
Реакции: keltuzhaknut

keltuzhaknut

Client
Регистрация
24.02.2016
Сообщения
221
Благодарностей
3
Баллы
18
Отлично, благодарю! Получилось. А можно как-нибудь сделать, чтобы закрывающиеся теги ставились не в самом конце, оно доставляет в канец, а рядом с тем тегом, в каком ошибку и нашло, где не хватает открывающегося\закрывающегося
 

keltuzhaknut

Client
Регистрация
24.02.2016
Сообщения
221
Благодарностей
3
Баллы
18
До
  • Код:
    [shortc2ode]<div id="opawumaci"><a href="#">Dr lee fantasy carnage</a>
    [/LIST]
    [LIST=1]
    <h1> </h1>
    <img src="http://sites.com/wp-content/uploads/photos/dr-lee-fantasy-carnage.jpg" width="565" height="548" alt="dr lee fantasy carnage" style="float: left;" title="dr lee fantasy carnage">
    <ul><li> </li><li> </li></ul></div>[/shortc2ode]
    [shortcode]<div align="center"><iframe src="http://www.freeonlinegames.com/embed/24600" width="640" height="480" frameborder="no" scrolling="no"></iframe></div>
    <h2 style="text-align: center;"> </h2>
    <p> <p> <p> </p> <p> </strong> <b> </b> </b> <b>
    </p> </p> </p>
    <h2 style="text-align: center;"></h2>
    <p>open<p>open<p><iframe src="http://www.veedi.com/player/notfoundframe.php" allowfullscreen="true" scrolling="no" id="Veediframe" style="transition: all 0.3s ease-in-out 0s; display: block; margin: auto; overflow: hidden; background-color: black; background-image: url(&quot;http://www.veedi.com/player/img/original-loader_orig_2.gif&quot;-); background-position: center center; background-repeat: no-repeat; visibility: visible;" frameborder="0" height="0" width="0"></iframe>
    </p> <p> <p> </p>
    <p> <strong> </p>
    </p></p><p>[/shortcode]
После
  • Код:
    [shortc2ode]<div id="opawumaci"><a href="#">Dr lee fantasy carnage</a>
    [/LIST]
    <h1> </h1>
    <img src="http://sites.com/wp-content/uploads/photos/dr-lee-fantasy-carnage.jpg" width="565" height="548" alt="dr lee fantasy carnage" style="float: left;" title="dr lee fantasy carnage">
    <ul><li> </li><li> </li></ul></div>[/shortc2ode]
    [shortcode]<div align="center"><iframe src="http://www.freeonlinegames.com/embed/24600" width="640" height="480" frameborder="no" scrolling="no"></iframe></div>
    <h2 style="text-align: center;"> </h2>
    <p></p> <p></p> <p> </p> <p></p>  <b> </b>  <b>
    <p> </p> <p></p>
    <h2 style="text-align: center;"></h2>
    <p></p>open<p></p>open<p><iframe src="http://www.veedi.com/player/notfoundframe.php" allowfullscreen="true" scrolling="no" id="Veediframe" style="transition: all 0.3s ease-in-out 0s; display: block; margin: auto; overflow: hidden; background-color: black; background-image: url(&quot;http://www.veedi.com/player/img/original-loader_orig_2.gif&quot;-); background-position: center center; background-repeat: no-repeat; visibility: visible;" frameborder="0" height="0" width="0"></iframe>
    </p> <p></p> <p> </p>
    <p></p> <strong> <p>
    </p><p></p><p></p>[/shortcode]</strong></b>
 

freeman

Client
Регистрация
31.07.2010
Сообщения
130
Благодарностей
138
Баллы
43
Добавить в шаблон инструмент Директивы using и общий код. Открыть его, перейти на вкладку Общий код и заменить код на этот.
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;
using ZennoLab.CommandCenter;
using ZennoLab.InterfacesLibrary;
using ZennoLab.InterfacesLibrary.ProjectModel;
using ZennoLab.InterfacesLibrary.ProjectModel.Collections;
using ZennoLab.InterfacesLibrary.ProjectModel.Enums;
using ZennoLab.Macros;
using Global.ZennoExtensions;
using ZennoLab.Emulation;
using HtmlAgilityPack;

namespace ZennoLab.OwnCode
{
    /// <summary>
    /// A simple class of the common code
    /// </summary>
    public class CommonCode
    {
        /// <summary>
        /// Lock this object to mark part of code for single thread execution
        /// </summary>
        public static object SyncObject = new object();

        // Insert your code here
    }
   
    public class NodePositions
    {
        private class NodePositionComparer : IComparer<HtmlNode>
        {
            public int Compare(HtmlNode x, HtmlNode y)
            {
                return x.StreamPosition.CompareTo(y.StreamPosition);
            }
        }

        public List<HtmlNode> Nodes = new List<HtmlNode>();

        public NodePositions(HtmlDocument doc)
        {
            AddNode(doc.DocumentNode);
            Nodes.Sort(new NodePositionComparer());
        }

        private void AddNode(HtmlNode node)
        {
            Nodes.Add(node);
            foreach (HtmlNode child in node.ChildNodes)
            {
                AddNode(child);
            }
        }
    }
}
Далее в экшн C# код вставить этот код.
Код:
HtmlAgilityPack.HtmlNode.ElementsFlags.Remove("p");

var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(project.Variables["html"].Value);

NodePositions pos = new NodePositions(doc);

foreach (HtmlAgilityPack.HtmlParseError error in doc.ParseErrors.Where(e => e.Code == HtmlAgilityPack.HtmlParseErrorCode.TagNotOpened))
{
    HtmlAgilityPack.HtmlTextNode last = pos.Nodes.OfType<HtmlAgilityPack.HtmlTextNode>().LastOrDefault(n => n.StreamPosition < error.StreamPosition);
    if (last != null)
    {
        last.Text = error.SourceText.Replace("/", "") + last.Text + error.SourceText;
    }
}

project.Variables["html"].Value = doc.DocumentNode.OuterHtml;
В итоге получается как-то так https://www.diffchecker.com/hgfRnDIA
 
  • Спасибо
Реакции: keltuzhaknut

keltuzhaknut

Client
Регистрация
24.02.2016
Сообщения
221
Благодарностей
3
Баллы
18
Благодарю, проблема - решилась, а вот теперь еще момент, получается, что не все картинки закрылись. Как быть с ними пример - <img src="http://site/wp-content/uploads/photos/logo.jpg#, rendering imageshack app, types alpine olympics tickets prices journal 2016 kids.</p> тут дальше текст ...Как сделать закрытым <img код ?
 

Nord

Client
Регистрация
22.03.2012
Сообщения
2 405
Благодарностей
1 471
Баллы
113
Благодарю, проблема - решилась, а вот теперь еще момент, получается, что не все картинки закрылись. Как быть с ними пример - <img src="http://site/wp-content/uploads/photos/logo.jpg#, rendering imageshack app, types alpine olympics tickets prices journal 2016 kids.</p> тут дальше текст ...Как сделать закрытым <img код ?
Ну сделай ззамену .jpg# на .jpg"> и всех прочих вариаций расширений изображений
 

keltuzhaknut

Client
Регистрация
24.02.2016
Сообщения
221
Благодарностей
3
Баллы
18
если в коде есть уже закрытые такие картинки и раз на раз открытые, чтобы не испортить код остальных корректных
 

Rimen

Client
Регистрация
28.10.2019
Сообщения
406
Благодарностей
253
Баллы
63
Добавить в шаблон инструмент Ссылки из GAC, там подключить библиотеку HtmlAgilityPack.dll и сборку System.Xml.dll. Первая библиотека есть в прикрепленном архиве, его нужно куда-нибудь распаковать и выбрать файл через кнопку Обзор. Вторая библиотека является частью .net и выбирается через фильтр. Далее нужно добавить в шаблон экшн C# код и скопировать туда этот код.
Код:
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(project.Variables["html"].Value);
project.Variables["html"].Value = doc.DocumentNode.OuterHtml;
Сам невалидный html код должен лежать в переменной html. После обработки результат будет помещен в эту же переменную.
можете пояснить пожалуйста как подключить библиотеку HtmlAgilityPack.dll ?
где искать ту самую кнопку "ОБзор" о которой идет речь?
не очень в теме подключения библиотек к зенке (
так https://zennolab.com/discussion/threads/kak-s-pomoschju-s-zakryt-vse-html-tegi.38358/#post-286345 тоже не сработало (
 
Последнее редактирование:

slavyn8213

Client
Регистрация
28.10.2018
Сообщения
247
Благодарностей
58
Баллы
28
можете пояснить пожалуйста как подключить библиотеку HtmlAgilityPack.dll ?
где искать ту самую кнопку "ОБзор" о которой идет речь?
не очень в теме подключения библиотек к зенке (
так https://zennolab.com/discussion/threads/kak-s-pomoschju-s-zakryt-vse-html-tegi.38358/#post-286345 тоже не сработало (
Для того, чтобы подключить библиотеку HtmlAgilityPack.dll в Zennoposter, следуйте следующим шагам:
  1. Скачайте библиотеку HtmlAgilityPack.dll с официального сайта разработчиков или через менеджер пакетов NuGet.
  2. Запустите Zennoposter и откройте ваш проект.
  3. В левой панели выберите вкладку "Добавить ссылки из GAC".
  4. Щелкните правой кнопкой мыши на разделе "ссылки из GAC" и выберите пункт "Добавить".
  5. В открывшемся окне нажмите на кнопку "Обзор".
  6. Укажите путь к файлу HtmlAgilityPack.dll, который вы скачали на первом шаге.
  7. Нажмите кнопку "OK".
Теперь вы можете использовать классы и методы из библиотеки HtmlAgilityPack в вашем проекте Zennoposter. Чтобы использовать библиотеку в коде, добавьте следующую директиву:
Добавить директивы using и общий код
using HtmlAgilityPack;

chat.openai.com
 
  • Спасибо
Реакции: todayer и Rimen

Кто просматривает тему: (Всего: 3, Пользователи: 0, Гости: 3)