起始:流量统计系统中衍生的小功能
目的:提取Url中Querystring指定键的值
BETA: (?<=key\=).*?(?=\&|$)
加强: (?<=(\&|\?|^)key\=).*?(?=\&|$)
示例代码:
示例代码
private
const
string
_regexSEQuery
=
@"
(?<=(\&|\?|^)({0})\=).*?(?=\&|$)
"
;
/// <summary>
/// 查找关键字
/// <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>
/// 复合查找关键字
/// </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();
}
/// <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;
}
{
// 搜索关键字
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;
}