11

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

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

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));

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

4

3 回答 3

11

这应该适合你:

<?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
于 2014-11-22T09:28:26.447 回答
2

使用细绳 在此处输入图像描述

作曲家.json

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

PHP

Stringy::create('string')->toTitleCase()
于 2019-04-05T01:37:43.773 回答
1

虽然对于您的两个输入字符串都不是 100% 正确,mb_convert_case()但它是此类任务的出色工具,因为它是一个单一的本机函数。

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

代码:(演示

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',
)

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

于 2021-08-12T14:12:20.073 回答