我有一个程序可以解析各种文件格式,目标是找到可本地化的字符串(几乎是 GetText)。我正在寻找一个正则表达式,它可以从特定的开始和结束标记中获取“要翻译的文本”。我有一个工作的正则表达式,但由于 IsVisible 调用,以下示例破坏了它。
<mw:Translate runat="server" Visible='<%# IsVisible() %>'>
TEXT TO TRANSLATE
</mw:Translate>
这是我目前所拥有的,但一直坚持下去……有什么帮助吗?我在//comments...
中描述了我错误的正则表达式意图(?s) //multiline flag
\<mw\:Translate //opening <mw:Translate> tag
(?:(?![^"']+\s*\>)+) //match anything but > preceeded by " or '
//with any whitespace after it
(?:["']+\s*)\> //match > preceeded by " or ' with any
//whitespace after it
\s* //match any whitespace
//(for trimming any whitespace around the text)
(?<text>.*?) //capturing group for the localizable text
\s* //match any whitespace
\</mw\:Translate\> //match closing tag
我遇到的问题可能是在开始标记中......我试图匹配结束括号 > 只有当它前面有 "或 ' 之后没有或任何空格......因为否则它要么是什么像 %> 或者它不是有效的 ASP.NET
编辑 1:请在得出结论之前阅读问题。这不是 HTML,而是 ASP.NET,任何 HTML 解析器都无法很好地解析它。我也针对一些非常具体的东西。更正:人们似乎同意它可以用 HtmlAgility 包解析,但我真的不想使用它,因为我真的不喜欢依赖外部库对于一个简单的用例。
编辑 2:mw:Translate 不能嵌套。由于 mw:Translate 的编程方式,它根本无法编译。
编辑 3:编辑说明。
编辑 4:不允许自动关闭 mw:translate
编辑 5:mw:Translate 中的 HTML 与 ASP.NET 页面上的任何其他文本一样有效
编辑 6:自己回答,我需要的正则表达式可能有点复杂(但不是因为与 HTML 有任何关系),见下文
最佳答案
即使这是 ASP.NET 而不是 HTML,您也可以使用 HtmlAgilityPack
解析它。
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html); // html is the aspx document text
var translatableTextNodes =
doc.DocumentNode.SelectNodes("//text()[contains(., 'TEXT TO TRANSLATE')]");
foreach (var parent in translatableTextNodes)
Console.WriteLine("Node:[{0}] Text:{1}",parent.Name, parent.InnerText);
输出示例页面包含您的服务器控件之一,其中包含TEXT TO TRANSLATE
:
Node:[mw:translate] Text:
TEXT TO TRANSLATE
关于c# - ASP.NET 标签的正则表达式解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17524788/