Wildcard search for domains in C#
At work, we had to do wildcard searches using regular expressions to match allowed domain names. For instance, this expression “*.madskristensen.dk” should match “www.madskristensen.dk”.
So, my boss Jimmi wrote a method that he allowed me to post here. Here are some examples on how to use it:
IsDomainValid(
"www.madskristensen.dk"
,
"*.madskristensen"
); is true
IsDomainValid(
"www.madskristensen.dk"
,
"www.madskristensen*"
); is true
IsDomainValid( "www.madskristensen.dk" , "madskristensen*" ); is false
IsDomainValid(
"www.madskristensen.dk"
,
"*mads*.dk"
); is true
IsDomainValid(
"www.madskristensen.dk"
,
"www.*.dk"
); is true
Here is the method.
///
<summary>
///
Checks if a wildcard string matches a domain
///
</summary>
public
static
bool
IsDomainValid(
string
domain,
string
domainToCheck)
{
if
(domainToCheck.Contains(
"*"
))
{
string
checkDomain = domainToCheck;
if
(checkDomain.StartsWith(
"*."
))
checkDomain =
"*"
+ checkDomain.Substring(2, checkDomain.Length - 2);
return
DoesWildcardMatch(domain, checkDomain);
}
else
{
return
domainToCheck.Equals(domain,
StringComparison
.OrdinalIgnoreCase);
}
}
///
<summary>
///
Performs a wildcard (*) search on any string.
///
</summary>
public
static
bool
DoesWildcardMatch(
string
originalString,
string
searchString)
{
if
(!searchString.StartsWith(
"*"
))
{
int
stop = searchString.IndexOf(
'*'
);
if
(!originalString.StartsWith(searchString.Substring(0, stop)))
return
false
;
}
if
(!searchString.EndsWith(
"*"
))
{
int
start = searchString.LastIndexOf(
'*'
) + 1;
if
(!originalString.EndsWith(searchString.Substring(start, searchString.Length - start)))
return
false
;
}
Regex
regex =
new
Regex
(searchString.Replace(
@"."
,
@"\."
).Replace(
@"*"
,
@".*"
));
return
regex.IsMatch(originalString);
}
You can also use the DoesWildcardMatch method alone.
DoesWildcardMatch(
"hello world"
,
"*world"
); is true