正则表达式提取Url中QueryString键值(搜索关键字的提取)

起始:流量统计系统中衍生的小功能

目的:提取Url中Querystring指定键的值

BETA: (?<=key\=).*?(?=\&|$)

加强: (?<=(\&|\?|^)key\=).*?(?=\&|$)

示例代码

示例代码
private const string _regexSEQuery = @"(?<=(\&|\?|^)({0})\=).*?(?=\&|$)";
/// <summary>
/// 查找关键字
/// <remarks>更多访问http://www.cnblogs.com/ronli/</remarks>
/// <param name="querykey">多个QueryKey按优先顺序用'|'分隔</param>
/// </summary>
private string RegexMatch(string input, string querykey, RegexOptions options)
{
return Regex.Match(input, string.Format(_regexSEQuery, querykey), options).Value.Trim();
}

/// <summary>
/// 复合查找关键字
/// <remarks>更多访问http://www.cnblogs.com/ronli/</remarks>
/// <param name="querykey">多个QueryKey按优先顺序用'&'(连接)或'|'(短路)分隔</param>
/// </summary>
private string RegexMatches(string input, string querykey, RegexOptions options)
{
string value = "";
string[] orKeys = querykey.Split('|');
string[] andKeys;

foreach (string or in orKeys)
{
andKeys
= or.Split('&');
foreach (string and in andKeys)
{
value
+= (RegexMatch(input, and, options) + " ");
}
if (value != "") break;
}
return value.Trim();
}

By Ron.li (http://www.cnblogs.com/ronli/)

实际应用:

提取搜索引擎的搜索关键字。

应用代码

应用代码
/// <summary>
/// 复合查找关键字
/// <summary>
 /// <remarks>更多访问http://www.cnblogs.com/ronli/</remarks>
private string GetSEQuery(HttpContext context)
{
//搜索关键字
string query = "";
string queryStrings = context.Server.UrlDecode(context.Request.UrlReferrer.Query);

if (visit.RefDomain.Contains("bing"))
query
= RegexMatch(queryStrings, "q", RegexOptions.IgnoreCase);
else if (visit.RefDomain.Contains("google"))
//q为空用oq代替
query = RegexMatches(queryStrings, "q|oq", RegexOptions.IgnoreCase);
//同时提取q和oq(空格连接)
//query = RegexMatches(queryStrings, "q&oq", RegexOptions.IgnoreCase);
//提取q,若为空用aq和oq代替
//query = RegexMatches(queryStrings, "q|aq&oq", RegexOptions.IgnoreCase);
else if (visit.RefDomain.Contains("baidu"))
query
= RegexMatch(queryStrings, "wd", RegexOptions.IgnoreCase);
else if (visit.RefDomain.Contains("yahoo"))
query
= RegexMatch(queryStrings, "p", RegexOptions.IgnoreCase);
else if (visit.RefDomain.Contains("sousou"))
query
= RegexMatch(queryStrings, "w", RegexOptions.IgnoreCase);
else if (visit.RefDomain.Contains("ask"))
query
= RegexMatch(queryStrings, "q", RegexOptions.IgnoreCase);

return query;
}
原文地址:https://www.cnblogs.com/ronli/p/RegexMatchQueryString.html