using System;
using System.Collections.Specialized;
using System.Globalization;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
namespace Tede.Data.Tests.Utils
{
public static class PageUtils
{
public const char SeparatorChar = '/';
public const string UnClickableUrl = "javascript:;";
public static string AddEndSlashToUrl(string url)
{
if (string.IsNullOrEmpty(url) || !url.EndsWith("/"))
{
url += "/";
}
return url;
}
public static string AddQuestionOrAndToUrl(string pageUrl)
{
var url = pageUrl;
if (string.IsNullOrEmpty(url))
{
url = "?";
}
else
{
if (url.IndexOf('?') == -1)
{
url = url + "?";
}
else if (!url.EndsWith("?"))
{
url = url + "&";
}
}
return url;
}
public static string RemoveFileNameFromUrl(string url)
{
if (string.IsNullOrEmpty(url)) return string.Empty;
url = url.Trim();
if (url.Contains("/"))
{
var fileName = url.Substring(url.LastIndexOf("/", StringComparison.Ordinal));
if (fileName.Contains("."))
{
return url.Substring(0, url.LastIndexOf("/", StringComparison.Ordinal));
}
}
return url;
}
public static string RemoveProtocolFromUrl(string url)
{
if (string.IsNullOrEmpty(url)) return string.Empty;
url = url.Trim();
return IsProtocolUrl(url) ? url.Substring(url.IndexOf("://", StringComparison.Ordinal) + 3) : url;
}
public static bool IsProtocolUrl(string url)
{
if (string.IsNullOrEmpty(url)) return false;
url = url.Trim();
return url.IndexOf("://", StringComparison.Ordinal) != -1 || url.StartsWith("javascript:");
}
public static bool IsAbsoluteUrl(string url)
{
if (string.IsNullOrEmpty(url)) return false;
url = url.Trim();
return url.StartsWith("/") || url.IndexOf("://", StringComparison.Ordinal) != -1 || url.StartsWith("javascript:");
}
public static string PathDifference(string path1, string path2, bool compareCase)
{
var num2 = -1;
var num1 = 0;
while ((num1 < path1.Length) && (num1 < path2.Length))
{
if ((path1[num1] != path2[num1]) && (compareCase || (char.ToLower(path1[num1], CultureInfo.InvariantCulture) != char.ToLower(path2[num1], CultureInfo.InvariantCulture))))
{
break;
}
if (path1[num1] == '/')
{
num2 = num1;
}
num1++;
}
if (num1 == 0)
{
return path2;
}
if ((num1 == path1.Length) && (num1 == path2.Length))
{
return string.Empty;
}
var builder1 = new StringBuilder();
while (num1 < path1.Length)
{
if (path1[num1] == '/')
{
builder1.Append("../");
}
num1++;
}
return (builder1 + path2.Substring(num2 + 1));
}
///
/// 获取服务器根域名
///
///
public static string GetMainDomain(string url)
{
if (string.IsNullOrEmpty(url)) return url;
url = RemoveProtocolFromUrl(url.ToLower());
if (url.IndexOf('/') != -1)
{
url = url.Substring(0, url.IndexOf('/'));
}
if (url.IndexOf('.') <= 0) return url;
var strArr = url.Split('.');
var lastStr = strArr.GetValue(strArr.Length - 1).ToString();
if (StringUtils.IsNumber(lastStr)) //如果最后一位是数字,那么说明是IP地址
{
return url;
}
var domainRules = ".com.cn|.net.cn|.org.cn|.gov.cn|.com|.net|.cn|.org|.cc|.me|.tel|.mobi|.asia|.biz|.info|.name|.tv|.hk|.公司|.中国|.网络".Split('|');
var returnStr = string.Empty;
foreach (var t in domainRules)
{
if (url.EndsWith(t.ToLower())) //如果最后有找到匹配项
{
var findStr = t;
var replaceStr = url.Replace(findStr, "");
if (replaceStr.IndexOf('.') > 0) //存在二级域名或者三级,比如:www.px915
{
var replaceArr = replaceStr.Split('.'); // www px915
returnStr = replaceArr.GetValue(replaceArr.Length - 1) + findStr;
return returnStr;
}
returnStr = replaceStr + findStr; //连接起来输出为:px915.com
return returnStr;
}
returnStr = url;
}
return returnStr;
}
public static string Combine(params string[] urls)
{
if (urls == null || urls.Length <= 0) return string.Empty;
var retval = urls[0]?.Replace(PathUtils.SeparatorChar, SeparatorChar) ?? string.Empty;
for (var i = 1; i < urls.Length; i++)
{
var url = (urls[i] != null) ? urls[i].Replace(PathUtils.SeparatorChar, SeparatorChar) : string.Empty;
retval = Combine(retval, url);
}
return retval;
}
private static string Combine(string url1, string url2)
{
if (url1 == null || url2 == null)
{
throw new ArgumentNullException(url1 == null ? "url1" : "url2");
}
if (url2.Length == 0)
{
return url1;
}
if (url1.Length == 0)
{
return url2;
}
return url1.TrimEnd(SeparatorChar) + SeparatorChar + url2.TrimStart(SeparatorChar);
}
public static string AddQueryString(string url, string queryStringKey, string queryStringValue)
{
var queryString = new NameValueCollection
{
{queryStringKey, queryStringValue}
};
return AddQueryString(url, queryString);
}
public static string AddQueryString(string url, string queryString)
{
if (queryString == null || url == null) return url;
queryString = queryString.TrimStart('?', '&');
if (url.IndexOf("?", StringComparison.Ordinal) == -1)
{
return string.Concat(url, "?", queryString);
}
return url.EndsWith("?") ? string.Concat(url, queryString) : string.Concat(url, "&", queryString);
}
public static string AddQueryString(string url, NameValueCollection queryString)
{
if (queryString == null || url == null || queryString.Count == 0)
return url;
var builder = new StringBuilder();
foreach (string key in queryString.Keys)
{
builder.Append($"&{key}={UrlEncode(queryString[key])}");
}
if (url.IndexOf("?", StringComparison.Ordinal) == -1)
{
if (builder.Length > 0) builder.Remove(0, 1);
return string.Concat(url, "?", builder.ToString());
}
if (url.EndsWith("?"))
{
if (builder.Length > 0) builder.Remove(0, 1);
}
return string.Concat(url, builder.ToString());
}
public static string RemoveQueryString(string url)
{
if (url == null) return null;
if (url.IndexOf("?", StringComparison.Ordinal) == -1 || url.EndsWith("?"))
{
return url;
}
return url.Substring(0, url.IndexOf("?", StringComparison.Ordinal));
}
public static string GetIpAddress(IPAddress ipAddress)
{
if (ipAddress == null) return "127.0.0.1";
return GetIpAddress(ipAddress.ToString());
}
public static string GetIpAddress(string remoteIpAddress)
{
var result = string.Empty;
//取CDN用户真实IP的方法
//当用户使用代理时,取到的是代理IP
result = remoteIpAddress;
if (!string.IsNullOrEmpty(result))
{
//可能有代理
if (result.IndexOf(".", StringComparison.Ordinal) == -1)
result = null;
else
{
if (result.IndexOf(",", StringComparison.Ordinal) != -1)
{
result = result.Replace(" ", "").Replace("'", "");
var temparyip = result.Split(",;".ToCharArray());
foreach (var t in temparyip)
{
if (IsIpAddress(t) && t.Substring(0, 3) != "10." && t.Substring(0, 7) != "192.168" && t.Substring(0, 7) != "172.16.")
{
result = t;
}
}
var str = result.Split(',');
if (str.Length > 0)
result = str[0].Trim();
}
else if (IsIpAddress(result))
return result;
}
}
if (string.IsNullOrEmpty(result) || result == "::1" || result == "127.0.0.1")
{
result = "localhost";
}
return result;
}
public static bool IsIpAddress(string ip)
{
return Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");
}
///
/// 将Url地址的查询字符串去掉
///
///
///
public static string GetUrlWithoutQueryString(string rawUrl)
{
string urlWithoutQueryString;
if (rawUrl != null && rawUrl.IndexOf("?", StringComparison.Ordinal) != -1)
{
var queryString = rawUrl.Substring(rawUrl.IndexOf("?", StringComparison.Ordinal));
urlWithoutQueryString = rawUrl.Replace(queryString, "");
}
else
{
urlWithoutQueryString = rawUrl;
}
return urlWithoutQueryString;
}
///
/// 将Url地址域名后的字符去掉
///
///
///
public static string GetUrlWithoutPathInfo(string rawUrl)
{
var urlWithoutPathInfo = string.Empty;
if (rawUrl != null && rawUrl.Trim().Length > 0)
{
if (rawUrl.ToLower().StartsWith("http://"))
{
urlWithoutPathInfo = rawUrl.Substring("http://".Length);
}
if (urlWithoutPathInfo.IndexOf("/", StringComparison.Ordinal) != -1)
{
urlWithoutPathInfo = urlWithoutPathInfo.Substring(0, urlWithoutPathInfo.IndexOf("/", StringComparison.Ordinal));
}
if (string.IsNullOrEmpty(urlWithoutPathInfo))
{
urlWithoutPathInfo = rawUrl;
}
urlWithoutPathInfo = "http://" + urlWithoutPathInfo;
}
return urlWithoutPathInfo;
}
///
/// 将Url地址后的文件名称去掉
///
///
///
public static string GetUrlWithoutFileName(string rawUrl)
{
if (string.IsNullOrEmpty(rawUrl)) return string.Empty;
var urlWithoutFileName = string.Empty;
if (rawUrl.ToLower().StartsWith("http://"))
{
urlWithoutFileName = rawUrl.Substring("http://".Length);
}
if (urlWithoutFileName.IndexOf("/", StringComparison.Ordinal) != -1 && !urlWithoutFileName.EndsWith("/"))
{
const string regex = "/(?[^/]*\\.[^/]*)[^/]*$";
const RegexOptions options = RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline | RegexOptions.IgnoreCase;
var reg = new Regex(regex, options);
var match = reg.Match(urlWithoutFileName);
if (match.Success)
{
var fileName = match.Groups["filename"].Value;
urlWithoutFileName = urlWithoutFileName.Substring(0, urlWithoutFileName.LastIndexOf(fileName, StringComparison.Ordinal));
}
}
urlWithoutFileName = "http://" + urlWithoutFileName;
return urlWithoutFileName;
}
public static string GetUrlQueryString(string url)
{
var queryString = string.Empty;
if (!string.IsNullOrEmpty(url) && url.IndexOf("?", StringComparison.Ordinal) != -1)
{
queryString = url.Substring(url.IndexOf("?", StringComparison.Ordinal) + 1);
}
return queryString;
}
public static string GetFileNameFromUrl(string rawUrl)
{
if (string.IsNullOrEmpty(rawUrl)) return string.Empty;
var fileName = string.Empty;
//if (rawUrl.ToLower().StartsWith("http://"))
//{
// rawUrl = rawUrl.Substring("http://".Length);
//}
//if (rawUrl.IndexOf("?") != -1)
//{
// int index = rawUrl.IndexOf("?");
// rawUrl = rawUrl.Remove(index, rawUrl.Length - index);
//}
rawUrl = RemoveProtocolFromUrl(rawUrl);
rawUrl = GetUrlWithoutQueryString(rawUrl);
if (rawUrl.IndexOf("/", StringComparison.Ordinal) != -1 && !rawUrl.EndsWith("/"))
{
const string regex = "/(?[^/]*\\.[^/]*)[^/]*$";
const RegexOptions options = RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline | RegexOptions.IgnoreCase;
var reg = new Regex(regex, options);
var match = reg.Match(rawUrl);
if (match.Success)
{
fileName = match.Groups["filename"].Value;
}
}
else
{
fileName = rawUrl;
}
return fileName;
}
public static string GetExtensionFromUrl(string rawUrl)
{
var extension = string.Empty;
if (!string.IsNullOrEmpty(rawUrl))
{
rawUrl = RemoveProtocolFromUrl(rawUrl);
rawUrl = GetUrlWithoutQueryString(rawUrl);
rawUrl = rawUrl.TrimEnd('/');
if (rawUrl.IndexOf('/') != -1)
{
rawUrl = rawUrl.Substring(rawUrl.LastIndexOf('/'));
if (rawUrl.IndexOf('.') != -1)
{
extension = rawUrl.Substring(rawUrl.LastIndexOf('.'));
}
}
}
return extension;
}
public static string UrlEncode(string url)
{
return WebUtility.UrlEncode(url);
}
public static string UrlDecode(string url)
{
return WebUtility.UrlDecode(url);
}
//public static string UrlEncode(string urlString)
//{
// if (urlString == null || urlString == "$4")
// {
// return string.Empty;
// }
// var newValue = urlString.Replace("\"", "'");
// newValue = HttpUtility.UrlEncode(newValue);
// newValue = newValue.Replace("%2f", "/");
// return newValue;
//}
//public static string UrlEncode(string urlString, string encoding)
//{
// if (urlString == null || urlString == "$4")
// {
// return string.Empty;
// }
// var newValue = urlString.Replace("\"", "'");
// newValue = HttpUtility.UrlEncode(newValue, Encoding.GetEncoding(encoding));
// newValue = newValue.Replace("%2f", "/");
// return newValue;
//}
//public static string UrlEncode(string urlString, ECharset charset)
//{
// if (urlString == null || urlString == "$4")
// {
// return string.Empty;
// }
// var newValue = urlString.Replace("\"", "'");
// newValue = HttpUtility.UrlEncode(newValue, ECharsetUtils.GetEncoding(charset));
// newValue = newValue.Replace("%2f", "/");
// return newValue;
//}
//public static string UrlDecode(string urlString, string encoding)
//{
// return HttpUtility.UrlDecode(urlString, Encoding.GetEncoding(encoding));
//}
//public static string UrlDecode(string urlString, ECharset charset)
//{
// return HttpUtility.UrlDecode(urlString, ECharsetUtils.GetEncoding(charset));
//}
//public static string UrlDecode(string urlString)
//{
// return HttpUtility.UrlDecode(urlString);
//}
public static bool IsVirtualUrl(string url)
{
if (!string.IsNullOrEmpty(url))
{
if (url.StartsWith("~") || url.StartsWith("@"))
{
return true;
}
}
return false;
}
public static string GetRedirectStringWithCheckBoxValue(string redirectUrl, string checkBoxServerId, string checkBoxClientId, string emptyAlertText)
{
return
$@"if (!_alertCheckBoxCollection(document.getElementsByName('{checkBoxClientId}'), '{emptyAlertText}')){{_goto('{redirectUrl}' + '&{checkBoxServerId}=' + _getCheckBoxCollectionValue(document.getElementsByName('{checkBoxClientId}')));}};return false;";
}
public static string GetRedirectStringWithCheckBoxValueAndAlert(string redirectUrl, string checkBoxServerId, string checkBoxClientId, string emptyAlertText, string confirmAlertText)
{
return
$@"_confirmCheckBoxCollection(document.getElementsByName('{checkBoxClientId}'), '{emptyAlertText}', '{confirmAlertText}', '{redirectUrl}' + '&{checkBoxServerId}=' + _getCheckBoxCollectionValue(document.getElementsByName('{checkBoxClientId}')));return false;";
}
public static string GetRedirectStringWithConfirm(string redirectUrl, string confirmString)
{
return $@"_confirm('{confirmString}', '{redirectUrl}');return false;";
}
}
}