Skip to main content
 首页 » 编程设计

c#之正则表达式仅在 URL 参数后跟以 "&"结尾的内容时才在 URL 参数中拆分 "="

2024年02月05日32wuhuacong

我一直在尝试使用格式错误的 URL 来解决一个难题,其中特定参数的值可能包含可能与解析 url 发生冲突的特定字符。

if( remaining.Contains( "?" ) || remaining.Contains( "#" ) ) 
{ 
    if( remaining.Contains( "?" ) ) 
    { 
 
        Path = remaining.Substring( 0, temp = remaining.IndexOf( "?" ) ); 
 
        remaining = remaining.Substring( temp + 1 ); 
 
        // Re-encode for URLs 
        if( remaining.Contains( "?" ) ) 
        { 
            remaining = URL.Substring( URL.IndexOf( "?" ) + 1 ); 
        } 
 
        if( remaining.IndexOf("=") >= 0 ) 
        { 
            string[] qsps = Regex.Split( remaining, @"[&]\b" );// Original Method: remaining.Split( '&' ); 
            qsps.ToList().ForEach( qsp => 
            { 
                string[] vals = qsp.Split( '=' ); 
                if( vals.Length == 2 ) 
                { 
                    Parameters.Add( vals[0], vals[1] ); 
                } 
                else 
                { 
                    string key = (string) vals[0].Clone(); 
                    vals[0] = ""; 
                    Parameters.Add( key, String.Join( "=", vals ).Substring( 1 ) ); 
                } 
            } ); 
        } 
} 

我添加了行“Regex.Split( remaining, @"[&]\b");”来抓取后面跟着一个字符的“&”,这似乎很有用。

我只是想看看是否有更好的方法来只拆分实际上用于参数的“&”?


测试示例(导致需要更新):

www.myURL.com/shop/product?utm_src=bm23&utm_med=email&utm_term=apparel&utm_content=02/15/2016&utm_campaign=Last Chance! Presidents' Day Sales Event: Free Shipping & More!

一个有效的正则表达式应该只抓取 & 用于以下内容:

  • utm_src=btm23
  • utm_med=电子邮件
  • utm_term=服装
  • utm_content=02/15/2016
  • utm_campaign=最后的机会!总统日销售事件:免费送货及更多优惠!

它不应该将“& More”算作匹配项,因为该部分之后不以“=”结尾

请您参考如下方法:

我建议使用前瞻性的正则表达式:

/&(?=[^&=]+=)/ 

您可以在这里看到效果:version1 .它首先查找 & 字符,然后向前“窥视”以确保 = 跟随,但前提是它不包含另一个 & 或中间的 =。

您还可以确保没有在 URL 中无效的空白字符(如换行符等)(version 2):

&(?=[^\s&=]+=)