【问题标题】:Converting php string to Title Case将php字符串转换为标题大小写
【发布时间】:2014-11-22 08:58:56
【问题描述】:

我想将输入字符串转换为标题大小写。

所以,如果我有一个输入字符串

Name: MR. M.A.D KARIM

我想产生以下输出字符串

Name: M.A.D Karim

如果我有一个输入字符串

Address: 12/A, ROOM NO-B 13

我要生产

Address: 12/A, Room No-B 13

我希望我的输出字符串在任何空白字符之后以及以下任何字符之后都有一个大写字母:.-/

我目前的解决方案是

ucwords(strtolower($string));

但它在.-/ 之后留下小写字母,而我希望它们大写。

【问题讨论】:

  • 可能值得一提的是this answer,它适用于这个问题中的两个输入字符串之一。

标签: php string title-case


【解决方案1】:

这应该适合你:

<?php


    $str = "Name: MR. M.A.D KARIM";
    $result = "";

    $arr = array();
    $pattern = '/([;:,-.\/ X])/';
    $array = preg_split($pattern, $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

    foreach($array as $k => $v)
        $result .= ucwords(strtolower($v));

    //$result = str_replace("Mr.", "", $result); ->If you don't want Mr. in a String
    echo $result;



?>

输入:

Name: MR. M.A.D KARIM
Address: 12/A, ROOM NO-B 13

输出:

Name: M.A.D Karim
Address: 12/A, Room No-B 13

【讨论】:

  • 是否有任何 PHP 实用程序库可以做到这一点?
  • 为什么在模式中使用 X?
【解决方案2】:

虽然您的两个输入字符串都不是 100% 正确,但 mb_convert_case() 是处理此类任务的绝佳工具,因为它是一个单一的原生函数。

要实现对输入字符串中特定序列的自定义处理,preg_replace_callback() 是合适的。我将使用多字节安全模式技术,以便整个解决方案保持多字节/unicode 安全。

代码:(Demo)

function titleCaseSpecial($string)
{
    return preg_replace_callback(
        '~[/.-]\p{Ll}~u',
        function ($m) {
            return mb_strtoupper($m[0], 'UTF-8');
        },
        mb_convert_case($string, MB_CASE_TITLE, 'UTF-8')
    );
}

$strings = [
    'Name: MR. M.A.D KARIM',
    'Address: 12/A, ROOM NO-B 13'
];

var_export(
    array_map('titleCaseSpecial', $strings)
);

输出:

array (
  0 => 'Name: Mr. M.A.D Karim',
  1 => 'Address: 12/A, Room No-B 13',
)

附:我假设问题中缺少的Mr. 只是一个发布错误。

【讨论】:

    【解决方案3】:

    使用Stringy

    composer.json

    "require": {
        "voku/stringy": "~5.0"
    }
    

    PHP

    Stringy::create('string')->toTitleCase()
    

    【讨论】:

      猜你喜欢
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      相关资源
      最近更新 更多