【问题标题】:Capitalize first letter of first word in a every sentence in ColdFusionColdFusion中每个句子中第一个单词的首字母大写
【发布时间】:2014-07-11 14:02:55
【问题描述】:

我想得到这样的字符串:

Lorem ipsum dolor sit amet,consectetur adipiscing elit。 Donec tempor pulvinar enim! Nec aliquam massa faucibus sed?? Praesent nec consectetur sapien... Nulla dapibus rut​​rum turpis, ac porta erat posuere vel.

从全部大写(或小写)的字符串开始。例如:

LOREM IPSUM DOLOR SIT AMET,CONSECTETUR ADIPISCING ELIT。 DONEC TEMPOR PULVINAR ENIM! NEC ALIQUAM 马萨 FAUCIBUS SED?? PRAESENT NEC CONSECTETUR SAPIEN... NULLA DAPIBUS RUTRUM TURPIS,AC PORTA ERAT POSUERE VEL。

我该怎么办? 谢谢!

【问题讨论】:

  • 你试过什么?向我们展示您遇到的一些代码和具体错误/问题。
  • UpperFirst() 可能会有所帮助。
  • 我有答案,但没有仔细阅读 - 抱歉 :)

标签: regex coldfusion railo cfml


【解决方案1】:

我会使用 CSS 而不是 ColdFusion 来做到这一点

<span style="text-transform : capitalize"><cfoutput>#lcase(mystring)#</cfoutput></span>

【讨论】:

  • Wait...缺少几个步骤,您需要先将文本小写,然后再将第一个字母大写 将他的字符串按原样环绕它(它不会小写所有其他字母)字母)。如果您需要为页面强制一些数据,这也会在标题标签中失败。这很好(也很方便),但不满足 OP 的要求。我也做了大写的 javascript DOM ......你还需要几个步骤。 jsfiddle.net/franktudor/3nh27
  • 我已经修改以涵盖文本以大写形式出现的事实。我在 OP 中没有看到任何关于 &lt;title&gt; 标签的内容
  • 你是对的......他没有。但我关于标题标签的观点是:我们不知道 OP 想用这个功能和最终的固定字符串做什么。但我亲身遇到过这个问题,所以我认为这是值得注意的。
【解决方案2】:

获取您的文本并将其设置为如下变量:

<cfset stringFixer = "LOREM IPSUM DOLOR SIT AMET, CONSECTETUR ADIPISCING ELIT. DONEC TEMPOR PULVINAR ENIM! NEC ALIQUAM MASSA FAUCIBUS SED?? PRAESENT NEC CONSECTETUR SAPIEN... NULLA DAPIBUS RUTRUM TURPIS, AC PORTA ERAT POSUERE VEL.">

全部小写:

<cfset stringFixer = lCase(stringFixer)>

然后您需要将字符串终止符与 rematch 匹配,如下所示:

<cfset stringFixerBreaker = reMatch('\w.+?[.?]+',stringFixer)>

reMatch() 会将您的字符串分解为较小的离散句子字符串...然后您可以使用replaceNoCase() 左搜索第一个字符然后对您的替换字符串执行相同操作,这将是相同的,但我们会在第一个字符上加上 uCase() 以使其大写。

<cfloop array="#stringFixerBreaker#" index="i">
<cfoutput>#replaceNoCase(i,left(i, 1 ),uCase(left(i, 1 )))# </cfoutput>
</cfloop>  

您的输出将如下所示:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec tempor pulvinar enim! nec aliquam massa faucibus sed?? Praesent nec consectetur sapien... Nulla dapibus rutrum turpis, ac porta erat posuere vel.

编辑:我的答案的最后一个接触点。

如果您需要重建字符串,请执行以下操作:

<cfset str = "">

<cfloop array="#stringFixerBreaker#" index="i">
    <cfset str = str & replaceNoCase(i,left(i, 1 ),uCase(left(i, 1 ))) & " ">
</cfloop>  

转储结果以检查一切是否正常:

<cfdump var="#str#">

【讨论】:

  • 你也可以使用,1个ucase和rest lcase。比如,
  • 感谢 Anit 我从来没有见过这样的做法。我很快就完成了这个过程,就像一个过程一样(我倾向于过度思考问题的解决方案)。我要测试你的表情。我确实喜欢上面答案中的 CSS 解决方案,但它并不能完全解决 OPs 问题。
  • @Frank Tudor 好的。这是一个很好的答案,我用它作为函数的基础。但是,我发现了一个重要的改进。如果文本的最后一句没有以句点或问号结尾,则该条目将从数组中省略。下面的正则表达式防范了这个缺陷 \w.+?[.?!]+|\w.+$ 它还添加了第三个和最后一个句尾标点符号,当然是一个感叹号。这个正则表达式将确保最后一个句子永远不会丢失,即使最后一个句子以字母数字字符结尾。无论如何我都赞成你的答案!
【解决方案3】:

虽然我个人喜欢@James A Mohler 解决方案,但您也可以在 CF 中使用简单的正则表达式来实现。

function Initcap(text){
    return rereplace(lcase(arguments.text), "(\b\w)", "\u\1", "all");
}

【讨论】:

    【解决方案4】:

    最好的方法是使用正则表达式和ReReplaceReReplaceNoCase

    <cfset mystring = "lorem ipsum"/>
    
    #ReReplace(mystring ,"\b(\w)","\u\1","ALL")#
    

    【讨论】:

    • @valueweaver - CF 函数不区分大小写,因此它被否决的原因值得怀疑。这可能是因为上面实际上不起作用。另外,几个月前这种方法was already mentioned。该线程中的示例确实有效。注意,他们使用了lower() 函数。
    • @leigh 我将再次运行它,看看它为什么不起作用。可以使用 ReReplaceNoCase。
    • @valueweaver - 这不是函数。逻辑有缺陷。 \u 仅将每个单词的第一个字母转换为大写。如果单词的其余部分是大写的(就像在 OP 中一样)怎么办?上面的代码不会处理这个问题。有意义吗?
    • 没错。急于帮助有需要的人忘记了逻辑的基本测试;)
    • 好吧,我不知道急什么,因为六个月前就已经回答了;-)
    【解决方案5】:

    这是我的方法,它适用于所有情况,除了麦当劳等情况。我可以让它大写“d”,但“s”也将大写。麦当劳。

     <cfif ISDefined('mywds')>
       <cfoutput>
          #mywds#<br>
           <cfset catz = #LCase(mywds)#>
              <cfloop index="dogz" list="#catz#" delimiters=" ">
                 <cfif Len(dogz) is 1 >
                     #UCase(dogz)#
                 <cfelse>
                     #Left(UCase(dogz), 1 )##Right(LCase(dogz),
                     Len(dogz) - 1 )#
                 </cfif>
              </cfloop>
          </cfoutput>
      </cfif>
    
    
     <cfform action="" method="POST" target="_self">
         <input type="text" name="mywds" size="50"><br>
         <input type="submit" name="submit" value="Submit">
     </cfform>
    

    这是一个工作表单,因此您可以粘贴到 .cfm 页面中,它会起作用。

    第二条cfif语句:

      <cfif Len(dogz) is 1 >
    

    如果有人输入像“john t williams”这样的文本,代码不会在单个字符“t”上抛出错误。

    【讨论】:

      猜你喜欢
      • 2020-08-30
      • 1970-01-01
      • 2015-01-25
      • 2012-05-20
      • 1970-01-01
      • 2011-07-20
      • 2017-08-02
      • 2013-12-15
      • 1970-01-01
      相关资源
      最近更新 更多