ASP.NET标记的Regex分析
本文关键字:Regex 分析 NET ASP | 更新日期: 2023-09-27 18:21:23
我有一个程序来解析各种文件格式,目的是找到可本地化的字符串(GetText)。我正在寻找一个正则表达式,它可以从特定的开始和结束标记中获得"TEXT TO TRANSLATE"。我有一个有效的正则表达式,但由于IsVisible调用,下面的示例破坏了它。
<mw:Translate runat="server" Visible='<%# IsVisible() %>'>
TEXT TO TRANSLATE
</mw:Translate>
到目前为止,这就是我所拥有的,但却被它卡住了……有什么帮助吗?我在//评论中描述了我错误地表达的意图。。。
(?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包解析,但我并不真的想使用它,因为我真的不喜欢在一个简单的用例中依赖外部lib。
EDIT 2:mw:不能嵌套Translate。由于mw:Translate的编程方式,它根本无法编译。
第3版:编辑澄清。
编辑4:自动关闭mw:不允许翻译
编辑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
即使您修改了正则表达式。以下是的一些问题
- 如果里面有其他标签,就不会工作(接下来不可能用regex解决这个问题)
- asp.net可以有像
<a href=''/>
这样的自关闭标签
使用htmlagilitypack
您可以使用此代码使用HtmlAgilityPack
进行检索
HtmlDocument doc = new HtmlDocument();
doc.Load(yourStream);
var itemList = doc.DocumentNode.SelectNodes("//Translate")//this xpath selects all translate tag
.Select(p => p.InnerText)
.ToList();
//itemList now contain all the translate tags content
我会尝试匹配属性列表,假设一个属性用引号或单引号括起来
这是一个假设,不是所有HTML都正确,但它可能对你有用:
<mw:Translate #opening <mw:Translate> tag
# Match attributes
(?:'s+'w+(?:'s*='s*(?:"[^"]*"|'[^']*'))?)*
's*
> #match >
's*
(?<text>.*?) #capturing group for the localizable text
's* #match any whitespace
</mw:Translate> #match closing tag
工作示例:http://regexhero.net/tester/?id=5834b4f1-095b-4af6-a0da-d1fe119778bc