I need help on the function REFindNocase. The project is old and still using CF9 so there is a limitation on what can be use.
Each student has a different BookSelectList. Example: it can be NULL (which allows them to see all books), or 1 (which allows them to see only Book A) or 1,2,3 (which allows them to see only Book A, B, C)
We have the below:
Which works fine until we hit book 10, since 10 consist of "1". REFindNocase will return 1 and display something they are not meant to see.
What can I do to avoid that? Can REFindNOcase compare Numbers instead of String? If so, how it can be done?
Thanks in advance!
I haven't tested this, but I think that if you set it up so that the string compare is for beginning (^) to end ($) then the REFindNoCase() will check the values against the whole argument.
<!--- Since Selection.BookSelectList is not within quotes, using the hashmarks is not only unnecessary, but will also slow things down.--->
This will compare the whole Selection.BookSelectList against the RegEx instead of searching globally for any instance.
I just re-read your post, and realized that my suggestion won't work if an actual list is presented.. SO.. what you can do, then, is iterate through the list looking for the RegEx mask and if found set a variable to true, then proceed from there.
<cfset variables.showBooks = len(Selection.BookSelectList) EQ 0 />
<cfloop index="variables.v" list="1,2,3,4,5,6,10">
<cfset variables.showBooks = variables.showBooks OR listFind(Selection.BookSelectList,variables.v) NEQ 0 />
<cfinclude template="showbooks.cfm" />
A regular expression search can be used but for this example I would say it is more trouble than it's worth. Also, the initial setting of showBooks checks for the NULL (empty string) value that your regular expression example code was missing.
The problem is I will have no idea what is being return.
Selection.BookSelectList could be anything depends on the student. Some students will have just 1 book while the other has 5. ie.
Student 1's Selection.BookSelectList could be (6, 10)
Student 2's Selection.BookSelectList could be (18)
Student 3's Selection.BookSelectList could be (1, 3, 5)
The problem with REFindNoCase() is that if anyone that has book 10 then book 1 will show as well because the function is reading it as a string, and 10 consist of the string 1 in it.
For the sake of discussion, let's say that Selection.BookSelectList is returned as "1,3,7,10,11" for one student. So now you have a list of five values.
If you iterate the list and set the REFind() (you don't need NoCase unless you're comparing text) to search each iteration (individual) value from start of 'string' to end...
<cfloop list="#Selection.BookSelectList#" index="ndx"> <!--- ndx will be '1' on first iteration; '3' on second iteration, etc. --->
<cfif ReFind("^(1|2|3|4|5|6)$",trim(ndx.toString()))><!--- RegEx is searching full string compared value, not just anywhere or global --->
... <!--- Will return TRUE for 1, but not 10 --->
Oh man, this works perfectly!!!!! THanks so much for your help! Greatly greatly appreciated.
Glad to hear that you got it working. And thank you for marking my answer correct. I do appreciate it.
<!--- To match free digit 1-6 --->
<!--- To match digit 1-6 among other (non digit) characters--->
I have an error when I tried you way:
Malformed regular expression "^[9-11]$".
|Reason: Invalid  range in expression..|
My Selection.BookSelectList returns 6, 10. Is it because it's not returning anything in 9-11 so it gives me an error?
You cannot do that. The  match is for single digits, which I had assumed was what you wanted. For 2 digits, use the same method, but then with .