【问题标题】:How to capitalize first letter of first word in a sentence?如何将句子中第一个单词的第一个字母大写?
【发布时间】:2011-07-20 00:01:50
【问题描述】:

我正在尝试编写一个函数来清理用户输入。

我不想让它变得完美。我宁愿用一些小写的名字和首字母缩写词,也不愿用大写的完整段落。

我认为该函数应该使用正则表达式,但我不擅长这些,我需要一些帮助。

如果下面的表达式后面跟着一个字母,我想把那个字母变成大写。

 "."
 ". " (followed by a space)
 "!"
 "! " (followed by a space)
 "?"
 "? " (followed by a space)

更好的是,该函数可以在“.”、“!”之后添加一个空格。和 ”?”如果后面跟着一个字母。

如何做到这一点?

【问题讨论】:

标签: php regex user-input text-segmentation


【解决方案1】:
$output = preg_replace('/([.!?])\s*(\w)/e', "strtoupper('\\1 \\2')", ucfirst(strtolower($input)));

由于修饰符 e 在 PHP 5.5.0 中已被弃用:

$output = preg_replace_callback('/([.!?])\s*(\w)/', function ($matches) {
    return strtoupper($matches[1] . ' ' . $matches[2]);
}, ucfirst(strtolower($input)));

【讨论】:

  • @w35l3y 你的代码让我很感兴趣......但是如果我的字符串带有一些类似的标签,例如:<span>hello.</span> this doesn' work ! ... 怎么办?对于这种情况,你能改进你的代码吗?实际上,如何在不删除它们的情况下逃脱<tags>?谢谢你:)
  • @Zagloo,在上述情况下,要求只有 1 个空格,与当前空格数无关。就您而言,这是一个新问题。考虑问一个新的,让我知道。简而言之,我没有好消息要告诉你,因为没有任何属性的 span 很容易,但是每个具有各种属性的嵌套节点呢?
  • @w35l3y 感谢您的回报!我昨天发了一个新帖子,有人在这里找到了解决方案:stackoverflow.com/questions/29366592/…;o)
  • 你好。我不明白正则表达式的[.!?] 部分。未转义的点不应该匹配任何字符(包括“!”和“?”)?我认为它应该被逃脱,但这个答案已经在这里很长时间了......
  • @NeDark,在[] 块中,除-^\] 之外的任何字符都是文字。
【解决方案2】:

这是你想要的代码:

<?php

$str = "paste your code! below. codepad will run it. are you sure?ok";

//first we make everything lowercase, and 
//then make the first letter if the entire string capitalized
$str = ucfirst(strtolower($str));

//now capitalize every letter after a . ? and ! followed by space
$str = preg_replace_callback('/[.!?] .*?\w/', 
  create_function('$matches', 'return strtoupper($matches[0]);'), $str);

//print the result
echo $str . "\n";
?>

输出: Paste your code! Below. Codepad will run it. Are you sure?ok

【讨论】:

  • 你不再需要 create_function :)(
【解决方案3】:

这个:

<?
$text = "abc. def! ghi? jkl.\n";
print $text;
$text = preg_replace("/([.!?]\s*\w)/e", "strtoupper('$1')", $text);
print $text;
?>

Output:
abc. def! ghi? jkl.
abc. Def! Ghi? Jkl.

请注意,您确实必须逃跑。!?在 [] 内。

【讨论】:

    【解决方案4】:

    使用./!/? 作为分隔符将字符串分隔成数组。遍历每个字符串并使用ucfirst(strtolower($currentString)),然后将它们再次连接成一个字符串。

    【讨论】:

    • 有趣的拍摄。我会试一试。我希望稍微练习一下我的正则表达式,但这可以完成工作。谢谢。
    【解决方案5】:

    这个怎么样?没有正则表达式。

    $letters = array(
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
     'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
    );
    foreach ($letters as $letter) {
        $string = str_replace('. ' . $letter, '. ' . ucwords($letter), $string);
        $string = str_replace('? ' . $letter, '? ' . ucwords($letter), $string);
        $string = str_replace('! ' . $letter, '! ' . ucwords($letter), $string);
    }
    

    对我来说工作得很好。

    【讨论】:

      【解决方案6】:
      $output = preg_replace('/([\.!\?]\s?\w)/e', "strtoupper('$1')", $input)
      

      【讨论】:

      • preg_replace():不再支持/e修饰符,改用preg_replace_callback
      【解决方案7】:
      $Tasks=["monday"=>"maths","tuesday"=>"physics","wednesday"=>"chemistry"];
      
      foreach($Tasks as $task=>$subject){
      
           echo "<b>".ucwords($task)."</b> : ".ucwords($subject)."<br/>";
      }
      

      【讨论】:

        猜你喜欢
        • 2011-02-18
        • 2022-11-27
        • 2014-07-11
        • 2021-01-13
        • 2014-05-13
        • 1970-01-01
        • 1970-01-01
        • 2012-06-23
        相关资源
        最近更新 更多