这是我another question的后续行动。我发现的解决方案对我投入的每一个测试用例都非常有用,直到出现第一次出现的情况为止。
我的目标是使用正则表达式重新格式化格式不正确的标记属性(我知道,可能不是我发现的一种万无一失的方法,但请耐心等待。)
我的职能:
Public Function ConvertMarkupAttributeQuoteType(ByVal html As String) As String
Dim findTags As String = "</?\w+((\s+\w+(\s*=\s*(?:"".*?""|'.*?'|[^'"">\s]+))?)+\s*|\s*)/?>"
Return Regex.Replace(html, findTags, AddressOf EvaluateTag)
End Function
Private Function EvaluateTag(ByVal match As Match) As String
Dim attributes As String = "\s*=\s*(?:(['""])(?<g1>(?:(?!\1).)*)\1|(?<g1>\S+))"
Return Regex.Replace(match.Value, attributes, "='$2'")
End Function
EvaluateTag
函数中的正则表达式将正确转换HTML,如
<table border=2 cellpadding='2' cellspacing="1">
进入
<table border='2' cellpadding='2' cellspacing='1'>
你会注意到我强迫属性值被单引号包围 - 不用担心。它破坏的情况是 last 属性值没有任何东西。
<table width=100 border=0>
来自正则表达式替换为
<table width='100' border='0>'
最后一个单引号错误地在标记之外。在此之前我已经承认我根本不擅长正则表达式;我只是没有花时间去理解它能做的一切。所以,我要求帮助调整EvaluateTag
正则表达式,以便它可以处理这个最后的情况。
谢谢!
答案 0 :(得分:1)
第一个RegEx函数将通过EvaluateTag传递整个匹配,这是整个HTML标记。
但是EvaluateTag并没有忽略最终的大于字符...
我担心我还没有足够的咖啡因来完成整个表达,但这个调整可能有效(在字符列表中添加了大于):
Private Function EvaluateTag(ByVal match As Match) As String
Dim attributes As String = "\s*=\s*(?:(['"">])(?<g1>(?:(?!\1).)*)\1|(?<g1>\S+))"
Return Regex.Replace(match.Value, attributes, "='$2'")
End Function
答案 1 :(得分:1)
richardtallent对正则表达式不起作用的解释指出了我正确的方向。在玩了一下之后,EvaluateTag函数的以下替换似乎正在起作用。
任何人都可以看到有问题吗?我做的改变是在管道之后的最后一组。也许它可以进一步简化?
Private Function EvaluateTag(ByVal match As Match) As String
Dim attributes As String = "\s*=\s*(?:(['""])(?<g1>(?:(?!\1).)*)\1|(?<g1>[^>\s]+))"
Return Regex.Replace(match.Value, attributes, "='$2'")
End Function
如果没有人回应,我可能会接受这个作为答案。再次感谢!