-3

一部の HTML コンテンツで正規表現置換を実行しようとしていますが、アンカー タグやリンク タグなどのタグ用に既に存在する URL に URL パラメーターを追加する必要があります。たとえば、のようなアンカータグを持っています

<a href="http://www.google.com">test</a> 

になるはずです(「?」を付けて)

<a href="http://www.google.com?append=1">test</a>

ただし、既に url パラメータがある場合は、それを追加するだけです。つまり、次のようになります。

<a href="http://www.google.com?s=this&q=test">test</a> 

になります (「&」を付けて)

<a href="http://www.google.com?s=this&q=test&append=1">test</a>

また、必ずしもリンクが常に存在するとは限らない場合があることも考慮する必要があります-次のように

<a href="javascript:doThis('test')">test</a> 

この場合、私はそれを放っておく必要があります。

次のような JavaScript に埋め込まれたリンクがある場合もあります。

<a href="javascript:doThis('http://www.google.com')">test</a> 
<a href="javascript:window.open('newWindow','http://www.google.com')">test</a>

これも次のように置き換えます (「&」または「?」を使用):

<a href="javascript:doThis('http://www.google.com?append=1')">test</a> 
<a href="javascript:window.open('newWindow','http://www.google.com?append=1')">test</a>

(これはそれほど重要ではありません - 私はこれなしで生活できます)

また、リンクに必ずしも http:// が含まれているとは限りません。単に相対リンクである可能性があります。

<a href="/home.aspx?s=this&q=test">test</a> 

以前のように追加するだけです:

<a href="/home.aspx?s=this&q=test&append=1">test</a> 

私は次のことを試しました - 最初のものはすべての JavaScript リンクと他のリンク (実際の URL ではない) を置き換えました。そして、2つ目はまったく機能しません...

    content = Regex.Replace(content, "href=\"(.*)\\?(.*)\"", "href=\"$1?append=1&$2\"", RegexOptions.IgnoreCase);
    content = Regex.Replace(content, "href=\"([^?]*)\"", "href=\"$1?append=2\"", RegexOptions.IgnoreCase);

編集: HTML Agility pack を既に使用しようとしましたが、取得している HTML が適切に形成されていないため、機能しません。また、私が取得している HTML は 1 つのライナーではなく、これを行う必要があるページ全体です...

4

3 に答える 3

4

HTMLAgilityPackを使用することから始めることをお勧めします。私は間違っている可能性がありますが、アンカータグを決定するために正規表現を使用しているように見えますか?それはおそらく最善のアイデアではなく、物事を複雑にしすぎる可能性があると思います。

すべてのアンカータグを取得してから、ドキュメントの次の例のようにそれらからhrefを取得できるはずです。

たとえば、HTMLファイル内のすべてのhrefを修正する方法は次のとおりです。

 HtmlDocument doc = new HtmlDocument();
 doc.Load("file.htm");
 foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"])
 {
    HtmlAttribute att = link["href"];
    att.Value = FixLink(att);
 }
 doc.Save("file.htm");

もちろん、それはあなたの問題を正確に解決するわけではありませんが、あなたはその考えを理解します。全体として、すべてに正規表現を使用しようとする方が良いアプローチだと思います。

于 2012-11-30T01:02:34.390 に答える
1

これは決して堅牢ではなく、この方法で実行することはお勧めしませんが、正規表現と文字列を置き換えるだけで実行したい場合は、次のようにします。

string source = "your html tag here";
string href = Regex.Match(source, "href=\".*\"").Value.Replace("\"", "").Replace("href=", "");
string url;
string toReplace;
bool tryToAppend = true;

if(href.Contains("'"))
{
    //if the href contains something else in quotes then its probably javascript
    //only capture something in quotes if it has a . (assume this means a url)
    url = Regex.Match(href, @"'.*\..*'").Value.Replace("'", "");

    //if we didnt find something in javascript with a . then abort
    if (url.Length == 0) 
    {
        tryToAppend = false;
    }
    toReplace = url;
}
else
{
    url = href;
    toReplace = url;
}

if (tryToAppend)
{
    if (url.Contains("?"))
    {
        url += "&append=1";
    }
    else
    {
        url += "?append=1";
    }

    source = source.Replace(toReplace, url);
}
于 2012-11-30T01:37:11.643 に答える
0

この最初の正規表現は、二重引用符で区切られたすべての href で機能するはずです。javascript: で始まる href は無視されます。主なシナリオのみをカバーしていますが、簡単です。

(href="(?!javascript:)[^"?]+)(?:(\?[^&"]+)(&[^"]+)?)?"

次の 3 つのキャプチャ グループを取得します。

  • ?グループ 1: HREF という単語から URL のファイル名への一致の開始 (存在する場合はの直前)。Example: href="http://www.google.com
  • グループ 2: ? およびクエリ文字列の最初のパラメーター。Example: ?append=1
  • グループ 3: 最初の & とそれに続くすべて。Example: &q=test&append=1

?キャプチャ グループ 2 および/または 3 に値があるかどうかを確認することで、パラメーターに aまたはを追加する必要があるかどうかを判断できます&。アンカーの例のうち、次のものが一致し、キャプチャ グループに次の値があります。

例 1:  
   href="http://www.google.com
 例 2:  
   href="http://www.google.com ?append=1
 例 3:  
   href="http://www.google.com ?s=this &q=test
 例 4:  
   href="http://www.google.com ?s=this &q=test&append=1
 例 10:
   href="/home.aspx ?s=this &q=test
 例 11:
   href="/home.aspx ?s=this &q=test&append=1

上記のシナリオと、javascript HREF 内のパスの追加シナリオをカバーする正規表現を作成しようとしました。それは機能しているように見えますが、私がきれいと呼ぶものではありません。できるだけ単純にするために、次の仮定を行いました。

  • HREF 値は二重引用符で区切られています。
  • JavaScript 関数パラメーター内の URL は絶対 URL であり、http:// で始まります。

正規表現には、上記と同じキャプチャ グループがあります。

(href="(?:javascript:[^\(]+\([^\)]*?http://[^"?\)]+|(?!javascript:)[^"?]+))(?:(\?[^&'"]+)(&[^"']+)?)?(?:'\))?"

繰り返しますが、例のアンカーのうち、次のものが一致し、キャプチャ グループに次の値があります。

例 1:  
   href="http://www.google.com
 例 2:  
   href="http://www.google.com ?append=1
 例 3:  
   href="http://www.google.com ?s=this &q=test
 例 4:  
   href="http://www.google.com ?s=this &q=test&append=1
 例 6:  
   href="javascript:doThis('http://www.google.com
 例 7:  
   href="javascript:window.open('newWindow','http://www.google.com
 例 8:  
   href="javascript:doThis('http://www.google.com ?append=1
 例 9:  
   href="javascript:window.open('newWindow','http://www.google.com ?append=1
 例 10:
   href="/home.aspx ?s=this &q=test
 例 11:
   href="/home.aspx ?s=this &q=test&append=1
于 2012-12-02T01:22:50.143 に答える