如何将CR + LF替换为<br />?

11
例如:
用户提交一个表单,其中包含一个带有 <textarea name="mytext" cols="35" rows="2"></textarea> 标记的区域,并在其中按下 ENTER. 我该如何将 CR-LF 替换为 <br />
5个回答

17

CF有一个名为ParagraphFormat()的函数可以实现此功能:

<cfset form.userText = paragraphFormat(form.usertext)/>

根据帮助文档 -

替换字符串中的字符:

  • 单个换行符(CR/LF序列)替换为空格
  • 双重换行符替换为HTML段落标记(<p>

它可能比您想要的做得更多,因为它还会查找双重换行符并添加<p></p>标记。

Ben 还有一个增强版本(UDF)称为 paragraph2,很容易修改以获得您想要的确切效果。这是链接:

http://www.cflib.org/udf/ParagraphFormat2


6
在这种情况下,我认为ParagraphFormat2可能更好,因为它将单行换行符转换为"<br />"(以及将双行换行符转换为HTML段落)。 - Steve Bryant

15

<cfset localVars.ReturnString = REReplace(localVars.ReturnString, "\r\n|\n\r|\n|\r", "<br />", "all")>

该代码是用来将字符串中的换行符替换成<br />标签,以便在 HTML 中正常显示。这个操作是针对不同需求(例如在 Windows/Linux 格式下编写、.ics 文件或 cfheaders 等)而实现的一般性函数的一个子集。

虽然你通常不会遇到 \n\r 这样的字符组合,但如果被忘记了正确的顺序而插入了这样的字符,就有可能出现。

<cffunction name="ReplaceEOL" access="public" output="false" returntype="string" hint="Replaces EOL codes with other characters">
    <cfargument name="String" required="true" type="string">
    <cfargument name="ReplaceWith" required="true" type="string">

    <cfreturn REReplace(Arguments.String, "\r\n|\n\r|\n|\r", Arguments.ReplaceWith, "all")>
</cffunction>

我刚刚修复了你的第一个示例并简化了代码,但是意识到这实际上无法按预期工作 - 在大多数现代正则表达式中,最早匹配获胜,因此单独的\r\n会在组合版本之前匹配,所以需要将它们移动到备选项的末尾 - 即\r\n|\n\r|\n|\r - 我已经修复了这个问题,但只是想指出这一点,因为记住这一点很有用。 - Peter Boughton
1
尽管个人而言,我总是会删除所有回车符,然后只需处理换行符,例如 String.replaceAll('\r','').replaceAll('\n','<br/>') - Peter Boughton

2

不要用 br 标签替换,显示这些值时可以使用 ParagraphFormat 函数。


2
您可以使用paragraphFormat()函数,但有时替换函数可以帮助您更直观地了解实际发生的情况。
例如:<cfset TheText=replace("#form.myText#",chr(13)&chr(10),"<br />","all")> 这将用HTML换行符替换所有回车换行符。

0

我更喜欢这样的写法:

<p>#REReplace(theParagraphText, "[#chr(10)#]+", "</p><p>", "ALL")#</p>

它将多个换行符合并为单个段落分隔符。


[#chr(10)#]+ 是一个冗长的写法,用来表示 \n+ - 但是无论如何,由于它不能处理回车符,这比 nosilleg 给出的现有答案 差。 - Peter Boughton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接