我一直在尝试使用格式错误的 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&=]+=)
