Parsing regex from an ".ini" file
Hey folks,
My first post to CF fora here - not sure if this is any of a) appropriate spot or even b) appropriate question.
I have a routine that works but its awfully slow considering that it needs to be called at the beginning of every session - I'm parsing through a fairly large .ini file for browser detection from application.cfc - would appreciate any insights if anyone sees anything I'm just hosing up badly. Obviously it mayn't be answerable to do idiosyncrasies of the browscap.ini file (that're tedious to go through).
<!---
**********************************************************************
Fetch user agent information
**********************************************************************
Important: This routine depends largely on keeping the browser
capability file up-to-date. Updates are currently available from:
http://browsers.garykeith.com/stream.asp?BrowsCapINI
---------------------------------------------------------------------- --->
<cffunction name="getBrowserInfo">
<cfscript>
// Set location of browscap.ini ----------------------------
browscap_ini = expandPath("./browscap.ini");
// Read wildcard patterns from the INI file ---------------
browscap_list = getProfileSections(browscap_ini);
// Seed some variables -------------------------------------
browser_champion_pattern = "*";
browser_champion_regex = "^.*$";
default_id = "*";
</cfscript>
<cfloop list="#browscap_list[default_id]#" index="keyname">
<cfscript>
xvalue = getProfileString(browscap_ini, default_id, keyname);
if (keyname neq "parent") { browscap['#keyname#'] = xvalue; }
</cfscript>
</cfloop>
<cfscript>
// Loop through the patterns to find the best match --------
for (browscap.browser_name_pattern in browscap_list) {
// Massage the wildcard into useable regex ---------------
browscap.browser_name_regex = lCase(browscap.browser_name_pattern);
browscap.browser_name_regex = replace(browscap.browser_name_regex, ".", "\.", "all");
browscap.browser_name_regex = replace(browscap.browser_name_regex, "*", ".*", "all");
browscap.browser_name_regex = replace(browscap.browser_name_regex, "?", ".", "all");
browscap.browser_name_regex = replace(browscap.browser_name_regex, "(", "\(", "all");
browscap.browser_name_regex = replace(browscap.browser_name_regex, ")", "\)", "all");
browscap.browser_name_regex = replace(browscap.browser_name_regex, "[", "\[", "all");
browscap.browser_name_regex = replace(browscap.browser_name_regex, "]", "\]", "all");
if (right(browscap.browser_name_regex, 1) eq "*") {
browscap.browser_name_regex = browscap.browser_name_regex & "$"; }
browscap.browser_name_regex = "^" & browscap.browser_name_regex;
// Test the resulting regex against the user agent -------
if (isValid("regular_expression", lCase(CGI.HTTP_USER_AGENT), browscap.browser_name_regex)) {
// User agent matches regex so we got a challenger -----
if (len(browscap.browser_name_pattern) ge len(browser_champion_pattern)) {
// If challenger is longer than champ then we got a new champ ----
browser_champion_pattern = browscap.browser_name_pattern;
browser_champion_regex = browscap.browser_name_regex; } } }
// Set the winning regex patterns --------------------------
browscap.browser_name_pattern = browser_champion_pattern;
browscap.browser_name_regex = browser_champion_regex;
</cfscript>
<!--- Check for a living parent record ----------------------- --->
<cfif (len(getProfileString(browscap_ini, browscap.browser_name_pattern, "parent")) gt 0)>
<cfset parent_id = getProfileString(browscap_ini, browscap.browser_name_pattern, "parent")>
<!--- Fetch the parental info ------------------------------ --->
<cfloop list="#browscap_list[parent_id]#" index="keyname">
<cfscript>
xvalue = getProfileString(browscap_ini, parent_id, keyname);
if (keyname neq "parent") { Session['agent_#keyname#'] = xvalue; }
</cfscript>
</cfloop>
</cfif>
<!--- Fetch the winning info --------------------------------- --->
<cfloop list="#browscap_list[browser_champion_pattern]#" index="keyname">
<cfscript>
xvalue = getProfileString(browscap_ini, browser_champion_pattern, keyname);
if (keyname neq "parent") { Session['agent_#keyname#'] = xvalue; }
</cfscript>
</cfloop>
</cffunction>