Это продолжение моего другого вопроса . Решение, которое я нашел, отлично работало для каждого из тестов, которые я ему задавал, пока не обнаружился случай, который ускользнул от меня в первый раз.
Моя цель - переформатировать неправильно отформатированные атрибуты тегов с помощью регулярных выражений (я знаю, что, возможно, это не надежный метод, как я узнаю, но терпите меня).
Мои функции:
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
, чтобы оно могло обрабатывать этот последний случай.
Спасибо!