gpt4 book ai didi

c# - 查找 xml 中所有不是标签的 'more or less than' 字符

转载 作者:数据小太阳 更新时间:2023-10-29 01:44:52 27 4
gpt4 key购买 nike

我需要一个正则表达式来查找所有不是 xml 标签的“<”或“>”。

例子:

<tag1>W<E><E</tag1>Z<>S

应该找到

<><<>

例子:

<tag1>W<E><E</E></tag1>Z<>S

应该找到

<<>

因此,任何“<”或“>”不在标签中的点击(是的,我们也有应该考虑的自动关闭标签:)

编辑#2:最后我想做的是用 html 编码的值替换所有匹配项。

编辑#3:

所以我想做的是从包含 HTML 和一些附加标签(很少有已知标签)的文本中获取标签中未包含的所有“<”和“>”。

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

<div>
<a href="link">Link with < characters</a>
<knownTag>Text with character ></knownTag>
<knownTag>Text < again ></knownTag>
<div>

结果应该是:

<div>
<a href="link">Link with &lt; characters</a>
<knownTag>Text with character &gt;</knownTag>
<knownTag>Text &lt; again &gt;</knownTag>
<div>

关于如何解决这个问题有什么想法吗?

最佳答案

这可以用正则表达式来完成;但是,它并不像您建议的那么简单。您将需要找到有效的标签并对其进行处理才能完成这项工作。碰巧我前段时间在编写一个快速轻便的 xml/html 解析器时这样做了。该代码位于:

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

要使用解析器,您将从两个源文件中的后者实现定义的接口(interface) 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);
}
}
}

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

<?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>

注意:我添加了 xml 声明、CDATA 和“&”文本,仅用于测试。

关于c# - 查找 xml 中所有不是标签的 'more or less than' 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17012223/

27 4 0