找到所有"多于或少于"字符,这些字符不是xml中的标签

Car*_*ist 8 c# regex xml

我需要一个正则表达式来查找不是xml-tags的所有'<'或'>'.

例:

<tag1>W<E><E</tag1>Z<>S
Run Code Online (Sandbox Code Playgroud)

应该找到

<><<>
Run Code Online (Sandbox Code Playgroud)

例:

<tag1>W<E><E</E></tag1>Z<>S
Run Code Online (Sandbox Code Playgroud)

应该找到

<<>
Run Code Online (Sandbox Code Playgroud)

所以,任何点击"<"或">"都不在标签中(是的,我们也有al-self-closing标签应该考虑在内:)

编辑#2: 我最终要做的是用html编码的值替换所有匹配.

编辑#3:

所以我想要做的是从一个包含HTML的文本和一些额外的标签(很少有已知的标签)得到所有'<'和'>',它们不包含在标签中.

示例(我想要找到的粗体,所以我可以用它们的编码值替换它们):

<div>
  <a href="link">Link with < characters</a>
  <knownTag>Text with character ></knownTag>
  <knownTag>Text < again ></knownTag>
<div>
Run Code Online (Sandbox Code Playgroud)

结果应该是:

<div>
  <a href="link">Link with &lt; characters</a>
  <knownTag>Text with character &gt;</knownTag>
  <knownTag>Text &lt; again &gt;</knownTag>
<div>
Run Code Online (Sandbox Code Playgroud)

有关如何解决这个问题的任何想法?

csh*_*net 6

这可以用正则表达式来完成; 但是,它并不像你建议的那么简单.您需要找到有效的标签并对其进行处理才能使其正常工作.我刚刚在编写一个快速且轻巧的xml/html解析器时就这样做了.该代码可在以下位置获得:

http://csharptest.net/browse/src/Library/Html/XmlLightParser.cs http://csharptest.net/browse/src/Library/Html/XmlLightInterfaces.cs

要使用解析器,您将从IXmlLightReader两个源文件中的较晚者实现定义的接口.以下示例生成您想要的结果,还可以处理您未提及的其他几个功能,如CDATA部分,处理指令,DTD等.

class RegexForBadXml
{
    const string Input = "<?xml version=\"1.0\"?>\r\n<div>\r\n\t<a href=\"link\">Link with < characters</a>\r\n\t<knownTag>Text with character > &and other &#BAD; stuff</knownTag>\r\n\t<knownTag>Text < again ></knownTag>\r\n\t<knownTag><![CDATA[ Text < again > ]]></knownTag>\r\n<div>";

    private static void Main()
    {
        var output = new StringWriter();
        XmlLightParser.Parse(Input, XmlLightParser.AttributeFormat.Html, new OutputFormatter(output));
        Console.WriteLine(output.ToString());
    }

    private class OutputFormatter : IXmlLightReader
    {
        private readonly TextWriter _output;
        public OutputFormatter(TextWriter output)
        {
            _output = output;
        }

        void IXmlLightReader.StartDocument() { }
        void IXmlLightReader.EndDocument() { }

        public void StartTag(XmlTagInfo tag)
        {
            _output.Write(tag.UnparsedTag);
        }

        public void EndTag(XmlTagInfo tag)
        {
            _output.Write(tag.UnparsedTag);
        }

        public void AddText(string content)
        {
            _output.Write(HttpUtility.HtmlEncode(HttpUtility.HtmlDecode(content)));
        }

        public void AddComment(string comment)
        {
            _output.Write(comment);
        }

        public void AddCData(string cdata)
        {
            _output.Write(cdata);
        }

        public void AddControl(string cdata)
        {
            _output.Write(cdata);
        }

        public void AddInstruction(string instruction)
        {
            _output.Write(instruction);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

前面的程序输出以下结果:

<?xml version="1.0"?>
<div>
    <a href="link">Link with &lt; characters</a>
    <knownTag>Text with character &gt; &amp;and other &amp;BAD; stuff</knownTag>
    <knownTag>Text &lt; again &gt;</knownTag>
    <knownTag><![CDATA[ Text < again > ]]></knownTag>
<div>
Run Code Online (Sandbox Code Playgroud)

注意:我添加了xml声明,CDATA和'&'文本仅供测试.