Question

How to make multi-line textarea field results into a delimited list

Asked by: brucecrabtree

I have set up a textarea field for users to enter email addresses to send a notice to. I've been trying to convert the results into a comma-delimited list, which I can then use as a recipient list for CFMAIL. I've tried using the Replace and ChangeList Delims functions but nothing is working -- if I enter this in the text area:

1
2
3
4
5

I always get this as the result:

1 2 3 4 5

I need this:

1,2,3,4,5

Here's the form I'm using as a test:

<form action="#cgi.query_string#" method="post">
<textarea name="addresses" cols="40" rows="10" wrap="physical"></textarea>
<input name="Submit" type="submit" value="Submit">

</form>

I've tried all variations on the wrap attribute in the form.

Here's the code I've tried to change the results:

<cfif isDefined("form.addresses")>
<cfset addresses=#form.addresses#>
<cfset addresses = ListChangeDelims(addresses, ",")>
 <cfoutput>#addresses#</cfoutput>
</cfif>

I've also tried this:

<cfif isDefined("form.addresses")>
<cfset addresses = #form.addresses#>
<cfset addresses = Replace(addresses, "chr(10)&chr(13)", ",", "ALL")>
 <cfoutput>addresses2</cfoutput>
</cfif>

And this:

<cfif isDefined("form.addresses")>
<cfset addresses = #form.addresses#>
<cfset addresses = Replace(addresses, "#chr(10)##(13)#", ",", "ALL")>
 <cfoutput>addresses2</cfoutput>
</cfif>

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2006-03-17 at 15:54:35ID21778812
Tags

textarea

Topic

ColdFusion Application Server

Participating Experts
5
Points
500
Comments
18

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. nesting <cfif> and <cfset>
    This Code won't work...why? I've tried different combinations of nesting <cfif> and <cfelseif> and it either skips to the last if statement and executes that (whether it is true or not) or if I use <cfelseif> it stops on the second <cfelseif> statement...
  2. IsDefined problem with Radio Buttons
    I have a group of radio buttons named Q03. When I use the following <CFIF>, CF still throws the error "Element Q03 is undefined in form." when no radio buttons have been clicked. <cfif NOT IsDefined("#FORM.Q03#")>Defined<cfelse>Not Defi...
  3. <CFScript> Vs <CFSet> and <CFIF>
    Is <CFScript> faster than <CFSet> and <CFIF> Example <CFScript> if(1=1){ foo=true; } </CFScript> vs <cfif 1 is 1> <cfset foo=true/> </cfif> Which one is better proformace wise???????
  4. if null cfset
    Simple question.... I have some nulls returning from a query and I'd like to set the values equal to something. I've tried it a few different ways. <cfif #something# eq NULL> <cfset something = "NA"> </cfif> ...with this I get an error <...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: brucecrabtreePosted on 2006-03-17 at 17:53:14ID: 16222171

I found a javascript solution to this problem on the web here: http://jennifermadden.com/javascript/stringEscape.html

I'd still like to know how to do it with CF, though, if anyone has a suggestion.

 

by: pmascariPosted on 2006-03-17 at 19:40:16ID: 16222454

You can nest your Replace() statement like so:

<cfset addresses = #form.addresses#>
<cfset addresses = Replace(Replace(addresses,chr(13),",","all"),chr(10),"","all")>

 

by: RCorfmanPosted on 2006-03-17 at 22:57:24ID: 16222922

I have a search form that I got out of a book, where every word on the same line is 'and-ed', and different lines are 'or-ed' together. This works from a textarea, and easily distinguishes the different lines. This could easily be changed to create a comma seperated list... in fact, the data from the textarea is treated as a list by this function, with each line break being a delimeter.
<CFPARAM name="Search" default="">
<CFSET CRLF="#Chr(13)##Chr(10)#">
<CFIF #Search# EQ ""><CFSET SearchCriteriaSQL="">
<CFELSE>
 <CFSET SearchCriteriaSQL=" and (0=1">
 <CFLOOP INDEX="line" LIST="#Search#" Delimiters="#CRLF#">
  <CFSET SearchCriteriaSQL = SearchCriteriaSQL & " OR (0=0">
  <CFLOOP INDEX="word" LIST=#line# Delimiters=" ">
    <CFSET SearchCriteriaSQL = SearchCriteriaSQL &
                         " AND #criteria# like '%" & Replace(word,"'","''","ALL") & "%'">
  </CFLOOP>
  <CFSET SearchCriteriaSQL = SearchCriteriaSQL & ")">
 </CFLOOP>
 <CFSET SearchCriteriaSQL = SearchCriteriaSQL & ")">
</CFIF>

Since all you want is to convert the values on each line to a list, you can do this:
<CFSET addresses= listChangeDelims(addresses,",","#Chr(13)##Chr(10)#")>

In fact, I tested it with a form here is the code on the action form:
-----------------------------------
Addresses is:<br>
<cfoutput>#adresses#</cfoutput>
<br>Converted Addresses is:<br>
<CFSET addresses= listChangeDelims(addresses,",","#Chr(13)##Chr(10)#")>
<cfoutput>#addresses#</cfoutput>
---------------------------------
The results of the above is:
Addresses is:
EMAIL1@COMPANY.COM EMAIL2@MYADDR.NET ANOTHER@EMAIL.COM YAHOO@YIPPEE.WORKS
Converted Addresses is:
EMAIL1@COMPANY.COM,EMAIL2@MYADDR.NET,ANOTHER@EMAIL.COM,YAHOO@YIPPEE.WORKS

Note that in the listarea, they were on different lines, but when output here, it doesn't show that because of the nature of CR and LF when displayed on a Web Page.

 

by: dgrafxPosted on 2006-03-18 at 07:09:44ID: 16224619

Bruce,
Just use this:
<cfif isDefined("form.addresses")>
<cfset form.addresses=rereplace(form.addresses,"([#chr(10)##chr(13)#])",",","ALL")>
</cfif>
and if you want to include tabs use #chr(9)# also

 

by: js_vaughanPosted on 2006-03-19 at 12:47:29ID: 16231021

Brucecrabtree,

pmascari's "Replace()" solution near the top is correct.

Alternativly if you wanted to use a regular expression like dgrafx, the proper way to do it is like below:

<cfif isDefined("form.addresses")>
  <cfset addresses = REReplace(FORM.addresses,"(#chr(10)#|#chr(13)#)+",",","ALL")>
  <cfoutput>#addresses#</cfoutput>
</cfif>

When i tried your solution dgrafx, I was getting multiple commas; my version would not.

 

by: RCorfmanPosted on 2006-03-19 at 13:14:35ID: 16231174

And there is something wrong with this solution?
<cfset addresses="">
<cfif isDefined("form.addresses")>
 <CFSET addresses= listChangeDelims(form.addresses,",","#Chr(13)##Chr(10)#")>
 <cfoutput>#addresses#</cfoutput>
</cfif>

 

by: dgrafxPosted on 2006-03-19 at 14:54:55ID: 16231698

Hi Guys,
>> js vaughan: You may be right (?) about the multiple commas as I didn't test.

Now that I think about it though, the multiple commas you may have gotten (I'm assuming from multiple cr's together) shouldn't be a problem as it doesn't change listlen - blank slot ya know. So you can't say that extra commas are a problem.

>>Bruce: It looks like all these simple solutions would work for you. They accomplish the same thing in slightly different ways.
So use rereplace or the listchangedelims that RCorfman posted above.

 

by: js_vaughanPosted on 2006-03-19 at 14:59:20ID: 16231722

That works as well; I was simply offering a new REReplace solution using a regular expression.

The only reason I mentioned pmascari was because he had the *first* solution that was correct.

I did not mean to discredit your advice in any way, sorry if my comment was mistaken.

 

by: js_vaughanPosted on 2006-03-19 at 15:06:34ID: 16231750

Very correct dgrafx about the empty list.  Technically speaking, Coldfusion would handle them both equally as well; I just always assume to remove empty sets whenever possible in case you wish to display the output.

 

by: dgrafxPosted on 2006-03-19 at 15:07:56ID: 16231760

Hey no worries - I didn't feel discredited :)

 

by: RCorfmanPosted on 2006-03-19 at 15:14:10ID: 16231781

I guess I felt like my solution got buried in with the others. It was closes to what was being tried initiailly and I would note is one simple call, not multiple runs across the data like the nexted replace, and the processing is simpler than a regex processing would be. It seems like all three solutions would work though.

 

by: js_vaughanPosted on 2006-03-19 at 15:34:58ID: 16231876

Agreed, all the solutions do work.

 

by: Mr_NilPosted on 2006-03-21 at 02:26:09ID: 16245362

Bruce,

You weren't actually all that far off the right solution in the first place.  The only error you made was to get the Carriage Return (chr(13)) and the Line Feed (chr(10)) the wrong way around.

RCorfman's solution is the most efficient solution, most readable.

Although, to be a pedant, the variables need scoping, you should be using StructKeyExists() rather than isDefined(), plus, personally, I would skip the #'s around the CRLF, which would give you :

<cfset variables.addresses="">
<cfif StructKeyExists(form,"addresses")>
 <CFSET variables.addresses= listChangeDelims(form.addresses,",",Chr(13)&Chr(10))>
 <cfoutput>#variables.addresses#</cfoutput>
</cfif>

 Don't be giving me any points for this. RCorfman is the one who gave you the correct solution first.

 

by: brucecrabtreePosted on 2006-03-21 at 06:34:36ID: 16247020

Thanks everyone. I've gotten sidetracked on another project and haven't had a chance to try these different solutions yet. But I should probably close this question now, and based on everyone's comments here it looks like I should split the points between RCorfman and pmascari, so that's what I'll do. Thanks again.

 

by: RCorfmanPosted on 2006-03-21 at 19:13:58ID: 16253914

Mr_Nil, like everyone, I'm still learning myself (a road that never ends). I'm curious as to why we shouldn't use isDefined()?  I agree with dropping the overused #... I had actually gotten that part of the code from a book...
I would note that the nice thing about changeDelims in this case is it doesn't matter what order the chr(10) and chr(13) are in as either one is considered a delimeter (if I understand correctly).

 

by: dgrafxPosted on 2006-03-21 at 19:28:16ID: 16253972

The order of the chr(10) & chr(13) doesn't matter using rereplace as I had. It will replace either.

 

by: Mr_NilPosted on 2006-03-22 at 00:01:59ID: 16255007

> Mr_Nil, like everyone, I'm still learning myself (a road that never ends).
>
Tell me about it - 9 years now and I'm still learning new stuff.

> I'm curious as to why we shouldn't use isDefined()?  
>
Its not so much that you shouldn't use it, but StructKeyExists is much more direct and efficient than isDefined().

In CFMX all variable scopes (apart from cookies - I think) are structures and always exist at the appropriate times eg. attributes scope struct exists when you call a custom tag or use cfmodule, arguments when you call a function and session etc when you have started a session using cfapplication.

When you use isDefined("myVariable"), or even isDefined("variables.myVariable") where the scope is specified, the CF Server begins scanning through all the variable scopes until it finds or fails to find the specified variable.  I forgot the exact order now, but its something like CF starts at the variables scope, looks through the form and url scopes, session, application and so on. It should be noted that CF also has to do this whenever you use a variable without a scope in your code.

Using StructKeyExists(variables,"myVariable") the CF Server looks directly in the variables scope for the variable you specify and no where else. It doesn't scan all the other scope structures, so it is much more efficient, as well being much clearer in your code as to exactly where you expect to find the variable and the value you need.

> I would note that the nice thing about changeDelims in this case is it doesn't matter what order the chr(10) and chr(13) are
> in as either one is considered a delimeter (if I understand correctly).
>
Yeah I think you are right - its more than one character so it should treat them seperately.  I was commenting more on the standard replace() function call that bruce had originally written.  Switch the LF and CR around in the replace to be CRLF and the second example of replace() code would have worked. eg. Replace(addresses, "#chr(13)##chr(10)#", ",", "ALL")

 

by: RCorfmanPosted on 2006-03-22 at 00:08:23ID: 16255026

Thanks. I knew they were structures. I should have thought on how the search must happen. Thanks for the info.

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...