2009-09-14 3 views
0

Это продолжение до another question. Решение, которое я нашел, отлично поработало для каждого из тестовых случаев, которые я бросил на него, пока не появился случай, который ускользал от меня в первый раз.Регулярное замещение HTML-тега не совсем корректно

Моя цель - переформатировать неправильно отформатированные атрибуты тегов с помощью регулярных выражений (я знаю, вероятно, не проверенный дураком метод, как я выяснил, но неся со мной).

Мои функции:

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'> 

Вы заметите, что я принуждая значения атрибутов быть окруженным одинарными кавычками - не беспокойтесь об этом. Случай, когда он ломается, - это то, что значение атрибута последнего не имеет ничего вокруг.

<table width=100 border=0> 

выходит из регулярных выражений замените

<table width='100' border='0>' 

с последними одинарными кавычками неправильно вне тега. Я уже признался, что я не очень хорошо разбираюсь в регулярном выражении; Я просто не нашел времени, чтобы понять все, что он может сделать. Итак, я прошу некоторую помощь в настройке регулярного выражения EvaluateTag, чтобы он мог справиться с этим окончательным случаем.

Спасибо!

+0

Я думаю, вам будет намного лучше использовать инструмент для очистки HTML (как было предложено da8 по вашему другому вопросу) или разбор HTML с помощью прощающего DOM и его реэкспортирования. – TrueWill

+0

Возможный дубликат [Можете ли вы привести несколько примеров того, почему трудно анализировать XML и HTML с помощью регулярного выражения?] (Http: // stackoverflow.com/questions/701166/can-you-обеспечить-some-examples-of-why-it-is-hard-to-parse-xml-and-html-with-a-rege) –

+0

Возможный дубликат [RegEx match open теги, кроме XHTML автономных тегов] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) –

ответ

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 

Если никто не отвечает, я, вероятно, согласен с этим в качестве ответа. Еще раз спасибо!

1

Первая функция RegEx пройдет EvaluateTag всего, что соответствует всему тегу HTML.

Но EvaluateTag не игнорирует окончательный Greater чем характер ...

Боюсь, у меня не было достаточно кофеина еще работать через все выражения, но эта корректировка может работы (добавляют более чем в списке символов): объяснение

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 
+0

Это не совсем сработало. Фактически, это не имело никакого эффекта в исходном регулярном выражении. –