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クリーニングツール(他の質問で示唆されているようにda8)を使用する方が良いでしょうか、または寛容なDOMでHTMLを解析して再エクスポートする方が良いでしょう。 – TrueWill

+0

[XMLとHTMLを正規表現で解析するのが難しい理由のいくつかの例を提供できますか?](http:// stackoverflow。com/questions/701166/can-you-provide-some-examples-of-the-is-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

これはうまくいきませんでした。実際、元の正規表現には何の影響もありませんでした。 –

関連する問題