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

keltuzhaknut

Client
Регистрация
24.02.2016
Сообщения
221
Реакции
3
Баллы
18
К примеру сгенирировался текст, но там есть не закрытые теги.. их нужно закрыть, как с помощью с# это реализовать?
<p><p> к примеру два открытых, нужно их закрыть или div контейнер или strong, b, i, li, ul и т.д.?
 
Как коду понять где закрывать тег?
 
По первому попавшему тегу, к примеру взял тег p - ишет первый /p нашел берет следующий, и т.д.
 
По первому попавшему тегу, к примеру взял тег p - ишет первый /p нашел берет следующий, и т.д.
То есть в тексте везде стоят конструкции со слешем типа "/p"? Ну тогда просто через замену
Или просто надо наугад влипить закрывающие?
 
То есть в тексте везде стоят конструкции со слешем типа "/p"? Ну тогда просто через замену
Или просто надо наугад влипить закрывающие?
он имел ввиду, что, если, например, есть два подряд открытых тега, а закрыт только один - закрыть второй сразу после 1го. Но всё это только один из хреналиона возможных вариантов расположения. Продумать логику под это всё мне кажется совсем не просто будет
 
можео попробовать такой хтмл скормить какому-нибдь хтмл агилити паку. Может он сам всё проставит, когда будет дерево собирать
 
Походу просто нужно заменить все нечетные совпадения по регулярке (<)(?!br)(\w+>) на $1/$2
В коде что-то не получилось придумать, как это реализовать, поэтому решил воспользоваться обычным кубиком замены. Но тут тоже облом:-) - при замене по диапазону (для нечетных совпадений - oddAll), замена происходит на текст $1/$2, а не на значения переменных $1 и $2
 
У браузеров есть такая вещь, как синтаксический и лексический анализатор. Неправильные теги они закрывают по списку специальных правил, но чтобы это все изучить тебе придется довольно много всего изучить, так что твоя задача не стоит свеч.
 
Дело в том, что нужно для импорта текста, если теги не закрытые, то импорт происходит с ошибкой, точнее запись отображается после обновления записи в ручную, когда вордпрес сам правит не закрытые теги.. Объем записей очень большой..
 
Я могу попросить своего знакомого, который опытнее меня в раз 10 минимум, но не факт, что у него будет свободное время и ценник может кусаться (точно не знаю). Но если он делает, то делает по высочайшему разряду
 
Дело в том, что нужно для импорта текста, если теги не закрытые, то импорт происходит с ошибкой, точнее запись отображается после обновления записи в ручную, когда вордпрес сам правит не закрытые теги.. Объем записей очень большой..
Добавьте сюда исходный материал для примера. Если и есть желающие поломать копья, то отсутствие примера для работы многих остановит.
Создавать ещё и текст с незакрытыми тегами будет просто лениво.
 
  • Оценить
Реакции: samsonnn и Dimionix
Код:
Развернуть Свернуть Копировать
[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]
 
HtmlAgilityPack умеет чинить невалидный html код, закрывать незакрытые тэги, удалять закрывающие тэги (если нет открывающих тэгов).
 
  • Оценить
Реакции: keltuzhaknut
HtmlAgilityPack умеет чинить невалидный html код, закрывать незакрытые тэги, удалять закрывающие тэги (если нет открывающих тэгов).
А как реализовать в проекте ?
 
Добавить в шаблон инструмент Ссылки из 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. После обработки результат будет помещен в эту же переменную.
 

Вложения

  • Оценить
Реакции: wizard и keltuzhaknut
Добавить в шаблон инструмент Ссылки из 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 - что-то не так..
 
Тут, скажем так, задача не из простых. В случае, когда есть закрывающий тэг, но отсутствует открывающий, определить место, где он должен находиться - невозможно. Можно попробовать этот код, но не факт, что он будет открывать/закрывать тэги именно там, где нужно.
Код:
Развернуть Свернуть Копировать
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
Отлично, благодарю! Получилось. А можно как-нибудь сделать, чтобы закрывающиеся теги ставились не в самом конце, оно доставляет в канец, а рядом с тем тегом, в каком ошибку и нашло, где не хватает открывающегося\закрывающегося
 
До
  • Код:
    Развернуть Свернуть Копировать
    [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>
 
Добавить в шаблон инструмент Директивы 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
Благодарю, проблема - решилась, а вот теперь еще момент, получается, что не все картинки закрылись. Как быть с ними пример - <img src="http://site/wp-content/uploads/photos/logo.jpg#, rendering imageshack app, types alpine olympics tickets prices journal 2016 kids.</p> тут дальше текст ...Как сделать закрытым <img код ?
 
Благодарю, проблема - решилась, а вот теперь еще момент, получается, что не все картинки закрылись. Как быть с ними пример - <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"> и всех прочих вариаций расширений изображений
 
если в коде есть уже закрытые такие картинки и раз на раз открытые, чтобы не испортить код остальных корректных
 
Добавить в шаблон инструмент Ссылки из 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 тоже не сработало (
 
Последнее редактирование:
можете пояснить пожалуйста как подключить библиотеку 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

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