Highlighted

should I be using REFindNocase in this case?

New Here ,
May 04, 2017

Copy link to clipboard

Copied

Hi,

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:

<cfif REFindNocase("(1|2|3|4|5|6)",#Selection.BookSelectList#)>

    <cfinclude template="showbooks.cfm">

</cfif>

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!

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 --->

  </cfif>

</cfloop>

HTH,

^_^

Views

658

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more

should I be using REFindNocase in this case?

New Here ,
May 04, 2017

Copy link to clipboard

Copied

Hi,

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:

<cfif REFindNocase("(1|2|3|4|5|6)",#Selection.BookSelectList#)>

    <cfinclude template="showbooks.cfm">

</cfif>

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!

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 --->

  </cfif>

</cfloop>

HTH,

^_^

Views

659

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
May 04, 2017 0
LEGEND ,
May 04, 2017

Copy link to clipboard

Copied

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.

<cfif REFindNoCase("^(1|2|3)$",Selection.BookSelectList)>

<!--- 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.

HTH,

^_^

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Reply
Loading...
May 04, 2017 0
LEGEND ,
May 04, 2017

Copy link to clipboard

Copied

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.

HTH,

^_^

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Reply
Loading...
May 04, 2017 0
Advocate ,
May 04, 2017

Copy link to clipboard

Copied

Maybe:

<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 />

</cfloop>

<cfif variables.showBooks>

    <cfinclude template="showbooks.cfm" />

</cfif>

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.

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Reply
Loading...
May 04, 2017 0
New Here ,
May 08, 2017

Copy link to clipboard

Copied

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.

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Reply
Loading...
May 08, 2017 0
LEGEND ,
May 08, 2017

Copy link to clipboard

Copied

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 --->

  </cfif>

</cfloop>

HTH,

^_^

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Reply
Loading...
May 08, 2017 1
New Here ,
May 09, 2017

Copy link to clipboard

Copied

Oh man, this works perfectly!!!!! THanks so much for your help! Greatly greatly appreciated.

KT

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Reply
Loading...
May 09, 2017 0
LEGEND ,
May 09, 2017

Copy link to clipboard

Copied

Glad to hear that you got it working.  And thank you for marking my answer correct.  I do appreciate it.

V/r,

^_^

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Reply
Loading...
May 09, 2017 0
Adobe Community Professional ,
May 05, 2017

Copy link to clipboard

Copied

Try

<!--- To match free digit 1-6 --->

<cfif REFindNocase("^[1-6]$",Selection.BookSelectList)>

<!--- To match digit 1-6 among other (non digit) characters--->

<cfif REFindNocase("^[1-6]$|^[1-6][\D]|[\D][1-6]$|[\D][1-6][\D]",Selection.BookSelectList)>

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Reply
Loading...
May 05, 2017 0
New Here ,
May 08, 2017

Copy link to clipboard

Copied

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?

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Reply
Loading...
May 08, 2017 0
Adobe Community Professional ,
May 08, 2017

Copy link to clipboard

Copied

[9-11]

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 [][].

Likes

Translate

Translate

Report

Report
Community Guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
Reply
Loading...
May 08, 2017 0