2009-09-14 2 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 청소 도구 (다른 질문에 제안 된대로)를 사용하거나 용서할 수있는 DOM으로 HTML을 파싱하고 다시 내보내는 것이 훨씬 나을 것이라고 생각합니다. – TrueWill

+0

[XML과 HTML을 정규식으로 구문 분석하기 어려운 이유에 대한 몇 가지 예를 제공 할 수 있습니까?] (http : // stackoverflow.com/questions/701166/can-you-provide-some-examples-of-the-is-the-is-to-parse-xml-and-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 함수는 전체 일치 (전체 HTML 태그)를 EvaluateTag로 전달합니다.

그러나 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 
+0

그건 꽤 작동하지 않았다. 사실, 그것은 원래 정규 표현식에 전혀 영향을 미치지 않았습니다. –