我一直在尝试使用格式错误的网址来解决这个问题,其中特定参数的值可能包含可能与解析网址冲突的特定字符。
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(剩余,@" [&] \ b"); "抓住"&"后面跟着一个角色,看起来很有用。
我只是想看看是否有更好的方法只能拆分"&'"实际上是参数吗?
要测试的示例(导致此需要更新):
www.myURL.com/shop/product?utm_src=bm23&utm_med=email&utm_term=apparel&utm_content=02/15/2016&utm_campaign=Last 机会!总统'日销售活动:免费送货&更!
正在运行的正则表达式只能抓取以下内容:
它不应该计算"&更"作为匹配,因为该部分不以" ="结束。之后
答案 0 :(得分:1)
我想使用这个正则表达式:
Regex.Split(url, @"(?<=(?:=\S+?))&",
RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
如果您通过url传递测试字符串,那就是。
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!
输出应为。
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!
请注意第一行输出。
www.myURL.com/shop/product?utm_src=bm23
包含网址的第一个路径,但可以通过?
答案 1 :(得分:1)
我建议使用前瞻的正则表达式:
/&(?=[^&=]+=)/
您可以在此处看到此效果:version1。它首先查找&
字符,然后向前“查看”以确保跟随=
,但前提是它不包含其他&
或=
之间。
您还可以确保没有任何空格字符(如换行符等)在网址中无效(version 2):
&(?=[^\s&=]+=)
答案 2 :(得分:1)
(?<=[?&])([^&]*)(?=.*[&=])
<强>解释强>
(?<=[?&])
对于&#39;&amp;&#39;或者&#39;?&#39; ([^&]*)
捕获尽可能多的字符,但不是&#39;&#39; (?=.*[&=])
对于&#39;&amp;&#39;的积极前瞻或&#39; =&#39; <强>输出:强>
所以要获得比赛:
string str = "www.myURL.com/...";
Regex reg = "(?<=[?&])([^&]*)(?=.*[&=])";
List<string> result = reg.Matches(str).Cast<Match>().Select(m => m.Value).ToList();
编辑问题编辑:
(?<=[?&])\S.*?(?=&\S)|(?<=[?&])\S.*(?=\s)
答案 3 :(得分:1)
不确定你要做什么,但如果你想找到错误的 &符号,这是一个很好的正则表达式。
&(?=[^&=]*(?:&|$))
您可以替换为%26
或与之分开。
如果你用它分裂,只需重新组合,错误的&符号就会消失。