我需要一个正则表达式来查找不是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 < characters</a>
<knownTag>Text with character ></knownTag>
<knownTag>Text < again ></knownTag>
<div>
Run Code Online (Sandbox Code Playgroud)
有关如何解决这个问题的任何想法?
这可以用正则表达式来完成; 但是,它并不像你建议的那么简单.您需要找到有效的标签并对其进行处理才能使其正常工作.我刚刚在编写一个快速且轻巧的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 < characters</a>
<knownTag>Text with character > &and other &BAD; stuff</knownTag>
<knownTag>Text < again ></knownTag>
<knownTag><![CDATA[ Text < again > ]]></knownTag>
<div>
Run Code Online (Sandbox Code Playgroud)
注意:我添加了xml声明,CDATA和'&'文本仅供测试.
归档时间: |
|
查看次数: |
1767 次 |
最近记录: |