0

これは私の別の質問へのフォローアップです。私が見つけた解決策は、私が最初に回避したケースが現れるまで、私が投げたすべてのテストケースでうまく機能しました。

私の目標は、正規表現を使用して不適切にフォーマットされたタグ属性を再フォーマットすることです(私が知っているように、おそらく絶対確実な方法ではありませんが、我慢してください)。

私の機能:

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

関数の正規表現は、EvaluateTagHTMLを次のように正しく変換します

<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したがって、この最後のケースを処理できるように正規表現を調整するための支援を求めています。

ありがとうございました!

4

2 に答える 2

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

誰も応答しない場合は、おそらくこれを答えとして受け入れます。再度、感謝します!

于 2009-09-15T01:27:15.840 に答える